DIP 57: static foreach

Adam D. Ruppe destructionator at gmail.com
Sun Mar 9 16:35:37 PDT 2014


On Sunday, 9 March 2014 at 23:14:06 UTC, bearophile wrote:
> How can it be an implementation detail if the compiler accepts 
> code like this?

That's really just a CTFE limitation, not an entirely different 
kind of loop. If ctfe carried across just a little bit more, this 
could work too:

         foreach(immutable a; [1,2,3])
                 mixin(a);


The major, fundamental difference between static foreach as 
proposed and foreach is:

* static foreach does not introduce a new scope. If you take your 
code and try to access x0 outside the loop, it will fail. With a 
static foreach, that would be allowed (just like how static if 
can declare variables)

* static foreach would be valid at module level and inside 
templates (like static if), whereas regular foreach is only 
permitted in a function (like regular if).


> You can't do anything like this with a dynamic foreach, it must 
> to be unrolled at compile-time:

Note that the optimizer is allowed to unroll any loop it desires. 
You can have local variables in a regular runtime loop too, but 
you can't refer to them outside, so the unrolling here is a code 
generator implementation detail rather than a fundamental 
difference in the language.


More information about the Digitalmars-d mailing list