Is it helpful to keep picking at these nits?<div><br></div><div>Dominic<br><br><div class="gmail_quote">On Fri, Oct 22, 2010 at 3:15 PM, Brendan Eich <span dir="ltr">&lt;<a href="mailto:brendan@mozilla.com">brendan@mozilla.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div style="word-wrap:break-word"><div><div class="im"><div>On Oct 21, 2010, at 10:58 PM, Dominic Cooney wrote:</div><br>
<blockquote type="cite">The proposed syntax for destructuring objects at &lt;<a href="http://wiki.ecmascript.org/doku.php?id=harmony:destructuring" target="_blank">http://wiki.ecmascript.org/doku.php?id=harmony:destructuring</a>&gt; is:<br>
<br>Pattern ::= &quot;{&quot; (Field (&quot;,&quot; Field)* &quot;,&quot;?)? &quot;}&quot; <br>
        (array destructuring elided)<br><div>Element ::= Pattern | LValue<br>Field ::= Identifier (&quot;:&quot; Element)?<br>LValue ::= &lt;any lvalue expression allowed in a normal assignment expression&gt;</div><div><br>

</div><div>This misses the opportunity for some parallelism with object literals. For example, I can construct {&#39; 0blah&#39;: x} with an object literal, but I can&#39;t access the &#39; 0blah&#39; with object destructuring.</div>
</blockquote><div><br></div></div>This is just another (still not formal enough, obviously not yet not carefully spec&#39;ed :-|) grammar bug, copied from the ES4 destructuring proposal page. SpiderMonkey and Rhino get it right:</div>
<div><br></div><div><div>js&gt; var {&quot;0&quot;: x} = {&quot;0&quot;:42}         </div><div>js&gt; x</div><div>42</div><div>js&gt; var {&quot;0blah&quot;: z} = {&quot;0blah&quot;:42} </div><div>js&gt; z</div><div>42</div>
<div class="im"><div><br></div><div><br></div><blockquote type="cite">
<div>Maybe Field ::= Identifier (&quot;:&quot; Element)? could be changed to:</div><div><br></div><div>Field ::= PropertyName (&quot;:&quot; Element)?</div><div><br></div><div>(using ECMA-262&#39;s PropertyName) to permit {&#39; 0blah&#39;: x} = ...</div>

<div><br></div><div>This also allows seeming nonsense like {&#39; 0blah&#39;}, but I&#39;m not sure that is so bad since bindings in *objects* can have names that aren&#39;t identifiers, so why not in scopes in general, too?</div>
</blockquote><div><br></div></div>No, that goes too far. There&#39;s no way to name the binding. It&#39;s not a property of any object. Again, SpiderMonkey:</div><div><br></div><div><div>js&gt; var {&quot;0blah&quot;} = {&quot;0blah&quot;:42}</div>
<div>typein:1: SyntaxError: missing variable name:</div><div>typein:1: var {&quot;0blah&quot;} = {&quot;0blah&quot;:42}</div><div>typein:1: .....^</div><div><br></div><div><br></div></div><div class="im"><div><blockquote type="cite">
<div>So to preserve desugarability you could spell out the alternatives of PropertyName in Field, to require elements with strings and numbers:</div><div><br></div><div>Field ::= Identifier (&quot;:&quot; Element)?</div>
<div>    | StringLiteral &quot;:&quot; Element</div><div>    | NumericLiteral &quot;:&quot; Element</div></blockquote><br></div></div><div>Right, that&#39;s the way to go. I&#39;ll make sure the wiki page is updated again. Thanks,</div>
<div><br></div><font color="#888888"><div>/be</div><br></font></div></blockquote></div><br></div>