foreach over string enum

spir denis.spir at gmail.com
Thu Feb 10 15:25:46 PST 2011


On 02/10/2011 11:32 PM, Jesse Phillips wrote:
>>> enum FileName : string {
>>> >  >  file1 = "file1.ext",
>>> >  >  file2 = "file2.ext"
>>> >  >  }
>>> >  >
>>> >  >  void main(string args[])
>>> >  >  {
>>> >  >        foreach(a; __traits(allMembers, FileName))
>>> >  >            writeln(mixin("FileName." ~ a));
>>> >  >  }
>> >
>> >  Why the mixin? Is it (just) to have the output string computed at compile-time?
> The value of 'a' is the enum field name, not its value.

Oops! missed this point ;-) Thanks for the explanation, Jesse.

This gave me the opportunity to ask about a detail. The following cannot 
compile because an argument to string mixin must be a (compile-time) constant:

unittest {
     auto i = 1;
     auto s = "i";
     writeln(mixin("i"));	// compiler happy up to here --> "1"
     writeln(mixin(s));		// compiler unhappy --> "Error: argument to mixin
				// must be a string, not (s)"
}

But in your example the symbol a does not look like a constant, instead it the 
loop variable. Do, how does it work? Or is it that the compiler is able to (1) 
detect that the collection beeing traversed (__traits(allMembers, FileName)) is 
a compile-time constant (2) unroll the loop so as to rewrite it first as:
     foreach(a; ["file1", "file2"])
         writeln(mixin("FileName." ~ a));	// ***
and then as:
     writeln(FileName.file1);
     writeln(FileName.file2);

But this doesn't work, neither:
     auto xx=1, yy=2;
     auto as = ["x","y"];
     foreach(a; as)
         writeln(mixin(a ~ a));
And in fact the line *** is laso not accepted.
So, finally, I understand your code, but not how the compiler processes it so 
as to see it as a mixin with constant argument.

Denis
-- 
_________________
vita es estrany
spir.wikidot.com



More information about the Digitalmars-d-learn mailing list