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