The magic behind foreach (was: Re: Descent 0.5.3 released)

Jarrett Billingsley jarrett.billingsley at gmail.com
Thu Jan 22 18:15:26 PST 2009


On Thu, Jan 22, 2009 at 7:00 PM, Bill Baxter <wbaxter at gmail.com> wrote:
>
> I posted a proposal for how to hide the magic int from the user a
> while back, but my conclusion was that my approach would require AST
> macros in order to give it a reasonable syntax.  With the ast macros
> you'd be able to do something like  yield(i) in the body of your
> foreach, where yield is an appropriately defined macro.
>

Consider the case where you return a value inside a foreach loop:

int find(char[] value)
{
    foreach(k, v; someAA)
        if(v == value)
            return k;
}

How is this implemented?  It puts a local variable in the stack frame
of find(), called __result.  Then the foreach delegate just writes
into that local when it returns (__result = k; return
IM_RETURNING_NOW;), and the compiler-generated cruft returns the value
of that local from find() (switch(...) { case IM_RETURNING_NOW: return
__result; }).

The delegate return status code doesn't have to be any different.
Just have the delegate return a bool (should iteration stop?) and put
its actual return status in the stack frame of the enclosing function.



More information about the Digitalmars-d mailing list