On Sep 17, 2007, at 4:02 PM, Carl Friedrich Bolz wrote:
Christian Tismer wrote:Ok, no problem, PyPy is the platform with the most chances to do this right, so why not discuss it here.I'd just prefer to change the topic then, since this is about a stackless sprint to finish and clean up things which are waiting. These things are going to be folded back into CPython stackless, where the re-incarnation of continuations is pretty unlikely.Oh, absolutely. A change of topic (or even a new thread) would have beengood.
Ok, thanks. I hope I'm not stepping on anyones toes by discussing continuations here. I'm a big fan of pypy project and find the work you're doing very interesting. I was just curious if there was any plans for supporting my favorite language feature :-) I'll insert my answer to Armin here: On Sep 17, 2007, at 12:31 PM, Armin Rigo wrote:
On Mon, Sep 17, 2007 at 03:00:51AM +0200, Erik Gorset wrote:Btw, it's possible to simulate some of call/cc's behavior using _stackless.fork() (I have a play-implementation lying around here somewhere). But it has several issues. The biggest one is that fork() actually copies some of the objects found on the stack. It's been a while since I've played around with cloneable and fork, so maybe this has been fixed.A deep issue with continuations in a language like Python is that thereis no single best definition of what it should capture and what it should not. If you think about what you would like to occur when youcapture a continuation or fork a coroutine, then you'll notice that youactually want some objects on the stack to be duplicated, and others not.
Actually, continuation should never copy objects. It's only about the non-local returns. For example the return statement makes it possible to jump back to the caller. If return instead was a function which you could save and call again, you would have the equivalent of call/cc. The big point here is that you don't have a stack anymore, but a tree of continuations.
For example, in: def f(n): return [x*x for x in range(n)] which, remember, is equivalent to: def f(n): lst = [] for x in range(n): lst.append(x*x) return lstif we pause this function in the middle of the loop and fork it, then itfeels "right" to duplicate the list -- otherwise both the original and the copy will append the remaining items into the same list, resulting in a single list with more than n elements.
This is similar to problems with some implementation of map in scheme, not all are safe to use with call/cc. Some care must be taken to make sure different control flows are compatible with each other. With great power comes great responsibility ;-) The thing is, with call/cc it'spossible to embed different paradigms in python like constraint, logic and
dataflow programming. I find this very interesting :-)
In essence, it seems to me that both forking and full continuations should not be part of the core of a language, for the same reasons as pickling -- in my own experience at least, more than half of the time"pickle" doesn't capture enough or capture too much. There is no singlebest solution.
I think I will have to disagree here. Several uses of continuations already
exists in the language like generators/coroutines, the return statement, loops and exceptions. True continuations unifies this into one concept with simple semantics. The option for a virtual machine implementationis then to either implement all the normal flow controls as special cases, or use true continuations as the fundamental building block for the rest.
-- Erik Gorset
smime.p7s
Description: S/MIME cryptographic signature
_______________________________________________ [email protected] http://codespeak.net/mailman/listinfo/pypy-dev
