The Pythonista wrote:
Yesterday, I was hacking around a bit, trying to figure out how to
implement the semantics of call/cc in Python. Specifically, I wanted to
translate this Scheme code to equivalent Python:
####
(define theContinuation #f)
(define (test)
(let ((i 0))
(call/cc (lambda (k) (set! theContinuation k)))
(set! i (+ i 1))
i))
(test)
(theContinuation)
(theContinuation)
####
Incidentally, those last three lines evaluate to 1, 2, and 3,
respectively.
The best Python translation I could come up with was something like this
(targeted at Python 2.5):
####
import inspect
theContinuation = None
def call_cc (f):
f (inspect.currentframe().f_back)
def invoke (c):
exec c.f_code in c.f_globals, c.f_locals
def test():
i = 0
call_cc (lambda k: globals().update({'theContinuation' : k }))
i = i + 1
print i
test()
invoke (theContinuation)
invoke (theContinuation)
####
Now, this code is wrong on a number of levels [I am indeed aware of
exactly how ugly that lambda is...], but, in particular, my
continuations / stack frames don't seem to be resuming at the right
point. I'd expect invoke (theContinuation) to restart on the line
immediately following call_cc, but it does not. Not surprisingly, the
output is also wrong. (I get 1, 1, and 1 rather than 1, 2, and 3.)
Can anyone help me by, perhaps pointing out some silly error I made?
Failing that, can someone show me a working implementation of call/cc
(preferably based on some form of stack inspection)?
Thanks!
While I know absolutely no scheme what you show here is a generator in Python.
def theContinuation():
n = 0
while 1:
n += 1
yield n
invoke = theContinuation()
print
print invoke.next()
print invoke.next()
print invoke.next()
Maybe that is what you are looking for?
-Larry
--
http://mail.python.org/mailman/listinfo/python-list