return when desugaring to closures

Brendan Eich brendan at
Fri Oct 10 15:31:59 PDT 2008

On Oct 10, 2008, at 1:25 PM, Waldemar Horwat wrote:

> So what should f(5, 0) do?
> function f(x, h) {
>  while (true) {
>    try {
>      if (h == 0)
>        h = function() {break};

Just to repeat something Dave wrote, we don't propose to allow break  
in a function where the break is not in a labeled statement, switch,  
or loop within that function. Only lambda would support such novelties.

>      if (x != 0)
>        f(x-1, h);
>      else
>        h();

This will break from the while (true) in the outermost (x = 5)  
activation of f.

In Scheme implementations that support it, the analogue is call/ec --  
call-with-escape-continuation (weak continuation is another name for  
escape continuation) -- where the caller's continuation is the  
argument to the procedure passed to call/ec. Escape continuations are  
cheaper to implement and simpler to reason about than full call/cc  
continuations because of the dynamic error (exception) you get if you  
call the escape continuation outside of the dynamic extent of the  
current call.

Sorry if this is already known; Dave should wipe my chin as needed  
since he is the adult Schemer here and I'm the toddler.

>    } catch (e) {
>      alert("caught " + e + " on " + x);
>    } finally {
>      alert("f called finally on " + x);
>    }
>    alert("f looping on " + x);
>  }
>  alert("f exited on " + x);
> }

The break itself does not propagate as an exception, just to be clear.  
If the statement being broken from is inactive, then an exception will  
be thrown from the break evaluation in the function that was assigned  
to h. The call to h would have to come after control flow had left the  
outermost while (true), via a statement after that loop, or some other  
call made via a returned or heap reference (upward funarg).


More information about the Es-discuss mailing list