On 04/09/2012 01:26 AM, Kevin Cox wrote:
I was wondering about the foreach statement and when you implement
opApply() for a class it is implemented using closures.  I was wondering
if this is just how it is expressed or if it is actually syntatic
sugar.  The reason I aski is because if you have a return statement
inside a foreach it returns from the outside function not the "closure".

I was just wondering if anyone could spill the implementation details.

Thanks,
Kevin

Since opApply has to hand through the return code if it is non-zero, I assume that DMD simply generates a custom exit code for each possible way the foreach body can be exit from.

eg:

start:
foreach(x; foo){
    if(x==1) break;
    else if(x==2) return 10;
    else if(x==3) goto start;
    else if(x==4) continue;
    ...
}

==>

int __result;
start:
switch(foo.opApply((x){
    if(x==1) return 1;
    else if(x==2){__result = 10; return 2;}
    else if(x==3) return 3;
    else if(x==4) return 0;
    ...
}){
    case 0, 1: break;
    case 2: return __result;
    case 3: goto start;
}

Reply via email to