On Jul 6, 2011, at 3:19 PM, Allen Wirfs-Brock wrote:

> So, a next step is to look at this in combination with other Harmony 
> proposals.  In particular, the object literal extensions. 

Yes, I've been dividing and conquering ;-). Thanks for the followup.


> There is one pretty obvious ambiguity introduced by the methods property 
> shorthand.
> 
> Keep mind that property names are permitted to be keywords.  So
> 
> let ambig1 = {function () {}};    //object with method named 'function' or 0 
> argument lambda that returns a function object?

Never the latter, anonymous function expressions are not produced by Statement.


> let ambig2 = {if (x) {5}};    //object with method named 'if' or 0 argument 
> lambda that returns either 5 or undefined depending value of free variable x?

Quite.


> I don't think we want to loose the conciseness  of method property shorthand, 
> but I we can resolve this one by restricting the property name to being an 
> identifier rather than an identifierName in the method property shorthand.  
> Presumably if you really wanted to have a method property named function or 
> if (or any other keyword) you could use a StringLiteral property name in the 
> object literal:
> 
> let obj1 = {"function" () {}};    //object with method named 'function' 
> let obj2 = {"if" (x) {5}};    //object with method named 'if' 
> 
> However, are we going to have lookup issues with StringLiteral and 
> NumericLiteral method property name? "if"(x) or 123() are syntactically valid 
> call expressions so we have to see the { after the ) before we know it is an 
> object literal and not a block lambda.

Lookahead issues, yes.


> Property value short hand is also a problem:
> 
> let x=2;
> let ambig3 = {x};  //is this an object literal equivalent to {x:x} or a 0 
> argument block lambda that returns the value of x?

That one is noted already in arrow function syntax.


> I don't see a easy way to resolve this one other than  dropping property 
> value shorthand.  I'd be willing to sacrifice them in order to get block 
> lambdas

Block lambdas as proposed don't have any ambiguities because they require empty 
|| parameter lists for the zero-parameter case.


> I don't think the ! and ~ property attribute prefixes cause any ambiguity 
> issues:
> 
> let obj3 = {~x: 5};
> let obj4= (!z(a,b,c,d) {}};
> 
> however, it does further increase the lookahead necessary be decide between 
> an initial method property or an initial expression statement. This might be 
> enough to reexamine the use of these attribute prefixes.

The lookahead requirement is a problem for LR(1) validation, which I'm 
skeptical we can or should step away from.


>  I still think we need attribute control functionality  in object literals 
> but I think I would be willing to give up on them for the method property 
> shorthand if that would help.  Essentially say that you have to use an 
> old-fashioned property : property assignment if you want to specify 
> non-default method attributes:
> 
> let obj4={!z: function(a,b,c,d) {}};

Could the attribute punctuators go after the property name instead of before?

/be

_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to