On 04/17/2014 03:15 PM, Steven Schveighoffer wrote:
But should a foreach over a tuple a breakable statement?
Well, it is a foreach statement.
It is on the other hand not too clear what to do about 'static foreach',
but I am leaning towards banning non-labelled break and continue inside it.
Basically, the above seems to me it should be equivalent to:
case 1:
writefln("Found %s!", 1);
break;
case 2:
writefln("Found %s!", 2);
break;
...
The foreach should be gone once the foreach is executed at compile-time.
...
So are the break statements. The lowering is more along the lines of:
{
case 1:
writefln("Found %s!", 1);
goto Lbreakforeach;
case 2:
writefln("Found %s!", 2);
goto Lbreakforeach;
}
Lbreakforeach:;
If the break breaks the foreach, why isn't just case 1 produced? That
would be an actual break in the foreach, no?
-Steve
No. You don't know the dynamic behaviour of the code at runtime just by
unrolling the foreach body.
import std.stdio;
alias Seq(T...)=T;
void main(){
int x,y,z;
readf("%d %d %d",&x,&y,&z);
alias a=Seq!(x,y,z);
auto b=[x,y,z];
foreach(v;a){
if(v==2) break;
writeln(v);
}
foreach(v;b){
if(v==2) break;
writeln(v);
}
}