foreach vs. iterators

Kirk McDonald kirklin.mcdonald at gmail.com
Fri Nov 3 21:56:17 PST 2006


Bill Baxter wrote:
> Benji Smith wrote:
>> Bill Baxter wrote:
>>
>>> There's no way I can see to stop that juggernaut before it's done, 
>>> short of having it return, and if it returns then it'll lose its 
>>> state. Conceptually what you need is a 'yield' that keeps the current 
>>> stack frame alive, but returns to the caller.
>>
>>
>> But then your object can only have one iterator at a time, and what if 
>> you want to have multiple simultaneous iterators for any given object? 
>> The 'yield' keyword can only keep track of state for a single 
>> iterator, so this kind of code would fail:
>>
>>   foreach (Item outerItem; collection) {
>>     foreach (Item innerItem; collection) {
>>       doSomething(outerItem, innerItem);
>>     }
>>   }
> 
> No it wouldn't.  Not if you had support for real coroutines.  That's the 
> whole point of coroutines.  You can have multiple stack frames active at 
> the same time.   Each stack frame for the opApply's in the above case 
> would have its own local iterator state.
> 
> Now whether or not coroutines are realistically implementable in a 
> systems programming language like D is beyond me.  Stackless Python 
> folks did it, but perhaps they're taking advantage of the fact that 
> users of interpreted code are a bit more forgiving about runtime 
> overhead, and the fact that the interpreter has its own notion of the 
> stack that doesn't depend on low-level processor details like EAX 
> registers etc.  But technically I don't see any roadblocks.  I mean I 
> read somewhere that coroutines are an old assembly programming trick, so 
> the hardware is certainly capable of supporting the paradigm at the low 
> level.  It's basically just a jmp plus a manipulation of the stack 
> pointer when it comes right down to it.
> 
> --bb

I would direct your attention to StackThreads:

http://assertfalse.com/articles/stFAQ.shtml

Pyd uses this nifty package to wrap a class's opApply function with 
Python's iteration interface. (Which uses iterator objects with a 
.next() method.) The magic may be found in this bit of code:

http://www.dsource.org/projects/pyd/browser/trunk/infrastructure/pyd/iteration.d

-- 
Kirk McDonald
Pyd: Wrapping Python with D
http://pyd.dsource.org



More information about the Digitalmars-d-announce mailing list