Unifying Block and ObjectLiteral (was: Re: block-lambda revival)

Allen Wirfs-Brock allen at wirfs-brock.com
Wed Jul 6 15:19:25 PDT 2011

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

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?
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?

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.

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?

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

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.  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) {}};


On Jul 1, 2011, at 9:38 AM, Brendan Eich wrote:

> On Jun 30, 2011, at 9:46 PM, Brendan Eich wrote:
>> Oops -- thanks. I will fix in a strawman that captures all of this.
> Done:
> http://wiki.ecmascript.org/doku.php?id=strawman:block_vs_object_literal
> /be
> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss

More information about the es-discuss mailing list