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). /be _______________________________________________ Es-discuss mailing list Es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss