[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Abstracting continuations



I think I need to rephrase my question... I understand how to define a 
continuation
by taking a snapshot of the relevant program state at a particular point 
in the running
of the program.  What I'm curious about is whether there are any 
languages that
let you define a continuation without actually having to run the program 
to that
point first.

A label in Basic, for example, works this way.  You can GOTO to a spot 
in the
program defined by the label without the program having to "take" that
location first.  Of course, this is not a continuation because you are 
only changing
the instruction pointer, not the bindings, call stack etc.  But I can 
imagine a more
robust sort of label which specifies not just a program location but all 
the rest of
the things that a continuation needs to know.  Does any such construct 
exist?

Michael

Dan Sugalski wrote:

> At 10:11 AM -0400 8/16/03, Felix Klock's ll1 list proxy wrote:
>
>> On Friday, August 15, 2003, at 08:57  PM, Dan Sugalski wrote:
>>
>>> (I see this one's been missed in all the fun...)
>>>
>>> At 2:20 PM -0400 8/13/03, Michael St . Hippolyte wrote:
>>>
>>>> I am trying to improve my understanding of continuations
>>>> from the point of view of programming language design
>>>> rather than implementation, i.e. what sort of syntax is
>>>> necessary to give programmers the power to express
>>>> continuations, regardless of how it's implemented.
>>>
>>>
>>> In their simplest form, continuations don't require any syntactic 
>>> support. A simple:
>>>
>>>    foo = takecontinuation();
>>>
>>> to make foo a continuation object, and:
>>>
>>>    invoke(foo);
>>>
>>> to use the continuation are sufficient.
>>
>>
>> Does the continuation you're capturing above include the assignment 
>> to foo?  I'm guessing it doesn't, since your invoke(foo) command is 
>> not also taking an argument that is the value to be returned.
>
>
> Nope. It'd have to resume after the end of the statement or 
> expression, depending on how you wanted to express it. (I'd go for the 
> next statement, as your following example demonstrates the problem 
> wiht resuming expressions)
>
>> So, I'm guessing that this version of continuations have a very 
>> imperative flavor, where they aren't capturing the entire 
>> continuation at the point where takecontinuation() is called, but 
>> rather only the continuation AFTER the statement holding the 
>> takecontinuation() expression, right?   So, what would your 
>> formulation do here:
>>
>>    if ( foo = fakecontinuation(), 1 ) {
>>       then_do();
>>    } else {
>>       else_do();
>>    }
>>    finally_do();
>>    invoke(foo);
>>
>> Would the invoke here cause finally_do to be called next?  Or then_do?
>
>
> Were I to do it, I'd have it call finally_do(), though that restricts 
> somewhat the things that you can do with it. (OTOH, I'm more an 
> implementation guy than anything else, so the fact that the ultimate 
> form is awkward or limiting doesn't bother me, since it's just a 
> matter of transforming a nice version of the source to the awkward form)
>
>> Tangentially, I haven't worked too much in C, so I don't know whether 
>> you're describing the equivalent of setjmp() and longjmp(), but the 
>> descriptions I've heard of them sound very much like what you're 
>> describing here...  (perhaps the distinction is that they only 
>> capture the runtime stack, so they would not capture the remaining 
>> statements to be executed only the functions that we're returning 
>> to...?  Perhaps we should describe the various granularities 
>> [[expression, statement, call-stack]] that are available for 
>> capturing continuations)
>
>
> No, I'm talking full continuations here. setjmp is a nasty, mutant, 
> evil, twisted abomination posing as a useful function. (Though I 
> suppose I might be being a bit kind :)