-
Notifications
You must be signed in to change notification settings - Fork 3
Description
Currently, if you assign to a local variable in a continuation, this always creates a new name local to the continuation.
If the parent function whose continuation it is has a local variable with the same name, the standard Python semantics is to update (overwrite) that name - because looking at the unexpanded user source code, we are still inside the same function.
In actuality, we of course are not. The continuation is a closure defined inside the parent function, thus causing this bug.
This is particularly insidious because in the user code, there is no hint of another scope being introduced. For least surprise, we should maintain the illusion that the standard scoping rules apply to the unexpanded source code.
To fix this, we should be able to just nonlocal any local variables of the parent function when we generate the code for the continuation closure.
For where and how to do this, see the comment in the function split_at_callcc, in unpythonic/syntax/tailtools.py.