On Jan 13, 2012, at 9:04 PM, Axel Rauschmayer wrote:

> I think it’s a valid concern. The idea is: If I can implement my own loops 
> (the nice-looking paren-free syntax feeds that illusion!) then I also want 
> those loops to have break and continue. You could statically determine what 
> construct, say, a break applies to and either throw a BreakException (if it 
> applies to a lambda) or TCP-break (if it applies to an enclosing non-lambda 
> loop). In the examples below, when I see a continue, I look for the innermost 
> enclosing loop braces and the ones belong to list[i].forEach are definitely 
> candidates.

If I understand your suggestion, you're proposing that non-local break and 
continue should be exposed as standard exceptions, and then implementors of 
loop-like abstractions could choose to catch them. E.g. you could implement 
forEach as:

    Array.prototype.forEach = function(f) {
        for (let i = 0, n = this.length; i < n; i++) {
            try {
                f.call(this, this[i], i);
            } catch (e) {
                if (e instanceof BreakException)
                    break;
                else if (e instanceof ContinueException)
                    continue;
                else
                    throw e;
            }
        }
    };

Whereas a function that does *not* want to expose whether it's using loops 
would simply do nothing with BreakException and ContinueException, and they 
would propagate out and you'd get the lexical scoping semantics. Meanwhile, 
break/continue with an explicit target would never be catch-able.

Did I understand your suggestion correctly?

This *may* not violate TCP (I'm not quite sure), but I'm not enthusiastic about 
the idea. The semantics is significantly more complicated, and it requires you 
to understand whether a higher-order function like forEach is catching these 
exceptions or not. So it becomes an additional part of the API of a function. 
If someone doesn't document what they do with BreakException and 
ContinueException, then writing callbacks you won't actually be able to predict 
what `break` and `continue` will do.

Dave

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to