question about generators
see_reply_address at something.invalid
Tue Aug 20 02:08:06 CEST 2002
David Eppstein wrote:
> But the set of generators currently involved in yield every statements
> doesn't form a stack, or even a set of paths
> Now that I think about it, though, a generator can only be calling
> "yield every" on one other generator,
> When any generator x is called, perform the following steps:
> while ancestor(x) is not x itself but has terminated:
> ancestor(x) = child(ancestor(x))
> while ancestor(ancestor(x)) != ancestor(x):
> ancestor(x) = ancestor(ancestor(x))
> perform actual generator call on ancestor(x)
I've thought about this a bit more, and I think it can be done
a lot more simply than that. All that's needed is a pointer in
each generator-iterator that points to the subject of the
current yield-every statement being executed, if any.
The next() method of the generator-iterator first checks this
pointer, and if it's not null, does a next() on it instead.
If it's null, or calling next() on it raises StopIteration,
carry on executing until the next yield as usual.
This will still require going down a chain of next() methods
when generators are nested, but the calls will all be C calls
and should therefore be quite fast.
Greg Ewing, Computer Science Dept,
University of Canterbury,
Christchurch, New Zealand
More information about the Python-list