Allen Wirfs-Brock wrote:
On Apr 23, 2012, at 8:19 AM, Brendan Eich wrote:

Andreas Rossberg wrote:
To be honest, that suggestion confirms one of my fears about "1JS" --
ending up with a more complicated language with ad-hoc rules about
which mode applies in which context. Please let's try to resist the
temptation. As much as I would like to encourage strict mode, I think
we should keep it orthogonal to other constructs as much as possible.
I can bear tying it to modules, but let's not go any further.
It's a good point (and I'm not one to "encourage strict mode" if there's no 
payoff for developers, but before agreeing, can you enumerate the cases that matter 
inside an arrow function body?

Without arguments runtime semantic shifts, and with |this| lexical, there 
aren't many strict mode changes left IIRC, and they are pretty edgy edge cases.

See Annex C.  Some strict mode highlights:

Assignment to an unbound name throws instead of creating a property of the 
global object

Right. This one I want in new forms, and it's not ad-hoc if arrows imply strict mode. Limiting strict mode implication to modules is just as arbitrary and more user-hostile in my view. No one writing arrows wants to create globals implicitly, only to save themselves by typing a "use strict"; pseudo-pragma!

With statements are disallowed

Ditto^2.

direct eval can't instantiate new binding in the enclosing environment

Ditto^3.

duplicate formal parameter names are disallowed

We disallow duplicates if destructuring formal parameters appear in any parameter list, in SpiderMonkey. We discussed doing this for any function with destructuring parameters as part of the 1JS thread early this year. I forget whether you spec'ed it already.

In that earlier discussion we did not agree that using a destructuring formal parameter in a 'function' declaration or expression opts the body of the function into strict mode. More the reverse -- one formal parameter novelty does not say "strict throughout". But it can certainly say "no duplicate formals" and no one minds. Duplicate formals are a botch from ES1, added only to match JScript, IIRC.


(I suggest we add this restriction to arrow functions even if we say they aren't inherently strict. )


Agreed.

1JS is about new syntax as opt-in for new semantics. Those new semantics can be strict in 
some or all respects. There is nothing more ad-hoc about this than requiring "use 
strict"; to opt-in, no one wants the botches you enumerate, and the implementations 
already have strict mode factored mostly to compile time and can impute strictness to 
arrows.

Really, the botches you enumerate *are* botches. They should not be perpetuated 
into new function or module syntax where the body is introduced by a keyword 
that can imply strictness. Neither users nor implementors want this. The 
philosphical purity of separating concerns is an abstraction that is hostile to 
the best interests of users from all testimony I've heard [*].

/be

[*] I've never heard from anyone defending any of the botches listed above 
except for 'with', and when I push, it turns out people are using 'with' to 
make PHP-style templates -- but the requirement for dynamic scope is a phantom 
and one can generate even more efficient templates using Function or eval (and 
libraries do).


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

Reply via email to