[Date Prev][Date Next][Thread Prev][Thread Next][Date index][Thread index]

Re: st: Programming Problem: How to prevent macro substitution

From   Christoph Birkel <>
Subject   Re: st: Programming Problem: How to prevent macro substitution
Date   Wed, 16 Jul 2008 19:13:57 +0200

Eva, Nick,

thank you for your advice! I will try to transfer the generation of the temporary variables into the loop which generates the macro, and follow the suggestion of Nick, which seems to work well. Again: Many thanks!



Eva Poen schrieb:

Nick, thank you.

I was looking for a solution that can be done independently of the
creation of the temporary variables, since this is how Christoph
started the thread. What I didn't realise is that my solution will
contain the interior double quotes, which a simple -display- will not

. local test "hello " "hello"

. di "`test'"
hello hello

. di `"`test'"'
hello " "hello

It is therefore clearly not suitable, and plainly wrong. Thanks for
pointing it out to me. Austin gave a perfect, working solution.

I also agree that escaping macro substitution is often not the way
forward. At least I have managed to avoid it completely in my work.


2008/7/16 Nick Cox <>:

I see. Well, there will be an almost equally simple way of doing that,
or an equivalent, and one which certainly won't entail escaping macro

For example, suppose you are in a loop

Within some loop {
tempvar foo

local xlist `xlist'|`foo'

Otherwise put, I don't think there is ever a problem for which lines

local ldep`u' "ldep`u'"

are part of the solution.

(We had a similar thread a while back in which someone asserted that it
was sometimes necessary to delay substitution, and I kept disputing
that. It's a myth that seems to grow out of trying to translate other
programming styles to Stata macro programming.)


Eva Poen

Thanks, Nick.

However, your suggestion does not produce the desired result:

. di "`xlist'"|ldep0|ldep1|ldep2

While Christoph was after:

. di "`xlist'"|`ldep0'|`ldep1'|`ldep2'

Unless I am missing something here.


2008/7/16 Nick Cox <>:

I agree. In fact, I'd go one step further:

foreach u of numlist 0/2{
local xlist `xlist'|ldep`u'

Sometimes the quotes just make things more complicated.

Eva Poen

take it in steps and it works:

foreach u of numlist 0/2{
local xlist "`xlist' " "|" "`" "ldep`u'" "'"

-di "`xlist'"- returns|`ldep0'|`ldep1'|`ldep2'

on my machine.

2008/7/16 Christoph Birkel <>:

I want to program a loop which produces a macro `xlist' containing a

list of

dummy variable interaction expansion expressions with temporary


names `ldep0' , `ldep1' etc. as a string . For this purpose I wrote:
foreach u of numlist 0/`y2'{
local ldep`u' "ldep`u'"
local xlist "`xlist'|``ldep`u'''"
The resulting macro should contain an expression like "|`ldep0'|`ldep1'|`ldep2' " (when `y2' contains 2) which

can be

used as argument in -xi: reg-, as in: xi: reg yvar `xlist' .


temporary variables `ldep0' and so on, corresponding to the macros


generated later in a separate loop.)
What actually happens, is that, due to the single quotation marks,


macros containing the names of the temporary variables are subsituted


their content (which should not happen), so the content of the


macro is "|ldep0|ldep1|ldep2 ", which cannot



to refer to temporary variables. For the same reason, it is not

possible to

define a local macro with a string as content which starts and ends


quotation marks. I found no way to avoid the unintended macro


using "\" or compound quotes. Any recommendation is highly


* For searches and help try:

* For searches and help try:

Christoph Birkel, M.A.
Wissenschaftlicher Mitarbeiter
-Studienfachberater BA-Studiengänge Soziologie-
Martin-Luther-Universität Halle-Wittenberg
Institut für Soziologie
D-06099 Halle (Saale)
Tel.: ++ 49 3 45 / 55 24 22 5
Fax.: ++ 49 3 45 / 55 27 14 9

* For searches and help try:

© Copyright 1996–2017 StataCorp LLC   |   Terms of use   |   Privacy   |   Contact us   |   What's new   |   Site index