thinking about continuations

David Herman dherman at mozilla.com
Mon Apr 12 20:57:43 PDT 2010


Yes, that's an excellent point-- something like:

    function captured() {
        try {
            handler->();
            throw "throw";
        }
        finally {
            alert("finally!");
        }
    }

    function handler(k) {
        k();
    }

This calls the handler with A still on the stack, and the handler runs A again; then throwing passes through the finally twice, resulting in two alerts.

Thanks for the careful reading. Now I'm not sure whether the function call notation makes sense. There's a pigeonhole problem with finally: if you expect a capturing form of function call to happen in the context of its handlers/finalizers, but you also expect the handlers/finalizers to be executed when the activation is suspended, then you can't guarantee that a finally block only executes once.

With generators, this doesn't come up because `yield' simply jumps immediately out of the frame, without invoking additional user code first.

Dave

On Apr 12, 2010, at 7:08 PM, Waldemar Horwat wrote:

> David Herman wrote:
>>    Thinking about continuations
>>    http://calculist.blogspot.com/2010/04/thinking-about-continuations.html
> 
> Your attempted fix for evaluating finally blocks just moved the problem elsewhere.  Since in the final expression you have A(... A(x)), you'll just end up executing the same finally block twice under certain circumstances.
> 
>   Waldemar



More information about the es-discuss mailing list