Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: st: Macro parsing question.
From
Nick Cox <[email protected]>
To
[email protected]
Subject
Re: st: Macro parsing question.
Date
Thu, 14 Feb 2013 09:54:02 +0000
Parsing is not the issue here; it's what happens in a loop.
The code can be simplified to
loc list2 a b c
foreach k of loc list2 {
if "a" == "`k'" loc d %
else loc d Value
}
di "`d'"
As Amadou says, this is what happens
. loc list2 a b c
. foreach k of loc list2 {
2. if "a" == "`k'" loc d %
3. else loc d Value
4. }
. di "`d'"
Value
So, what's happening? The loop is cycling over "a" "b" "c" and the
code sets -d- to "%" if each of these is equal to "a", otherwise to
"Value".
We can do this step by step.
Is "a" == "a"? Yes. Set -d- to "%"
Is "a" == "b"? No. Set -d- to "Value".
Is "a" == "c"? No. Set -d- to "Value".
Once the loop is done, -d- is still "Value".
In fact, the loop can be short-circuited. Only the last element in the
list has an effect on -d- that survives beyond the loop, so it boils
down to
local d = cond("a" == "c", "Value", "%")
Nick
. loc list2 a b c
. foreach k of loc list2 {
2. if "a" == "`k'" loc d %
3. else loc d Value
4. }
. di "`d'"
Value
On Thu, Feb 14, 2013 at 9:24 AM, Amadou DIALLO <[email protected]> wrote:
> I spent the night programming some stuffs but cannot understand why I
> don't obtain the expected results. I was expecting "%" but got
> "Value". What am I doing wrong?
>
> noi se tr on
> loc list1 a
> loc list2 a b c
> loc d
> foreach j of loc list1 {
> foreach k of loc list2 {
> if "`j'" == "`k'" loc d %
> else loc d Value
> } // foreach k
> }
> di "`d'"
*
* For searches and help try:
* http://www.stata.com/help.cgi?search
* http://www.stata.com/support/faqs/resources/statalist-faq/
* http://www.ats.ucla.edu/stat/stata/