Destructuring syntax infelicity viz. identifier vs. property name

Dominic Cooney dominicc at google.com
Thu Oct 21 23:18:09 PDT 2010


Is it helpful to keep picking at these nits?

Dominic

On Fri, Oct 22, 2010 at 3:15 PM, Brendan Eich <brendan at mozilla.com> wrote:

> On Oct 21, 2010, at 10:58 PM, Dominic Cooney wrote:
>
> The proposed syntax for destructuring objects at <
> http://wiki.ecmascript.org/doku.php?id=harmony:destructuring> is:
>
> Pattern ::= "{" (Field ("," Field)* ","?)? "}"
>         (array destructuring elided)
> Element ::= Pattern | LValue
> Field ::= Identifier (":" Element)?
> LValue ::= <any lvalue expression allowed in a normal assignment
> expression>
>
> This misses the opportunity for some parallelism with object literals. For
> example, I can construct {' 0blah': x} with an object literal, but I can't
> access the ' 0blah' with object destructuring.
>
>
> This is just another (still not formal enough, obviously not yet not
> carefully spec'ed :-|) grammar bug, copied from the ES4 destructuring
> proposal page. SpiderMonkey and Rhino get it right:
>
> js> var {"0": x} = {"0":42}
> js> x
> 42
> js> var {"0blah": z} = {"0blah":42}
> js> z
> 42
>
>
> Maybe Field ::= Identifier (":" Element)? could be changed to:
>
> Field ::= PropertyName (":" Element)?
>
> (using ECMA-262's PropertyName) to permit {' 0blah': x} = ...
>
> This also allows seeming nonsense like {' 0blah'}, but I'm not sure that is
> so bad since bindings in *objects* can have names that aren't identifiers,
> so why not in scopes in general, too?
>
>
> No, that goes too far. There's no way to name the binding. It's not a
> property of any object. Again, SpiderMonkey:
>
> js> var {"0blah"} = {"0blah":42}
> typein:1: SyntaxError: missing variable name:
> typein:1: var {"0blah"} = {"0blah":42}
> typein:1: .....^
>
>
> So to preserve desugarability you could spell out the alternatives of
> PropertyName in Field, to require elements with strings and numbers:
>
> Field ::= Identifier (":" Element)?
>     | StringLiteral ":" Element
>     | NumericLiteral ":" Element
>
>
> Right, that's the way to go. I'll make sure the wiki page is updated again.
> Thanks,
>
> /be
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20101022/66d644a5/attachment.html>


More information about the es-discuss mailing list