At 10:40 PM 10/20/2005 +1000, Nick Coghlan wrote:
Phillip J. Eby wrote:
This is still rather rough, but I figured it's easier to let everybody fill in the remaining gaps by arguments than it is for me to pick a position I like and try to convince everybody else that it's right. :) Your feedback is requested and welcome.
I think you're actually highlighting a bigger issue with the behaviour of "yield" inside a "with" block, and working around it rather than fixing the fundamental problem.
The issue with "yield" causing changes to leak to outer scopes isn't limited to coroutine style usage - it can happen with generator-iterators, too.
What's missing is a general way of saying "suspend this context temporarily, and resume it when done".
Actually, it's fairly simple to write a generator decorator using context.swap() that saves and restores the current execution state around next()/send()/throw() calls, if you prefer it to be the generator's responsibility to maintain such context.