[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Demystifying Continuations
From: "David Simmons" <David.Simmons@smallscript.net>
> Next semantics question:
> Can I call an arbitrary continuation (not in my call-chain set)?
> In other words, if the continuation I call is not part of my current
> call-activation-chain, what happens to the current chain.
> One of the following...
> a) The current chain is effectively unwound to its root and then
> replaced by the new continuation.
> b) provided continuation is copied and grafted on to the tail of the
> current chain and then we continue.
> c) The current chain is suspended/abandoned and we just jump to the new
> continuation. ** This mode has very significant semantic problems with
> respect to guard handlers/finally operations **
The answer is C, but let me address the guard handlers/finally operations.
First (and unfortunately?), `finally' makes no sense when you can
re-enter a continuation. You have two options: never have a finally
clause, or mark the continuation as non-reentrant and raise an
error on attempting to re-enter.
Guard handlers are a bit easier. You have an `inside' and an `outside'
context. When entering the continuation, you invoke the inside,
when leaving (for any reason) you invoke the outside. When re-entering
you re-invoke the `inside'. This is what dynamic-wind gives you.
Note that there are (at least) two flavors of this dynamic state.
The state you unwind/rewind on thread switch, and the state you
unwind/rewind `globally'. The former might be a thread-local
value, the latter might be an open file.
> I'm assuming the answer is "c", and that a disjoint continuation
> represents a different thread. Which in turn means there are no unwind
> operations to perform since we are actually performing a thread-switch
> (where a call-activation-chain represents a thread).
> -- Dave S. [www.smallscript.org]
> > Michael