<br><br><div class="gmail_quote">On Thu, Apr 29, 2010 at 3:32 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><div></div><div class="h5"><div>On Apr 29, 2010, at 3:16 PM, Mark S. Miller wrote:</div><br><blockquote type="cite">On Thu, Apr 29, 2010 at 2:39 PM, Brendan Eich <span dir="ltr">&lt;<a href="mailto:brendan@mozilla.com" target="_blank">brendan@mozilla.com</a>&gt;</span> wrote:<br>
<div class="gmail_quote"><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><div>Really, methinks you guys protest too much. In particular Mike&#39;s &quot;all new productions that introduce a new keyword should be restricted&quot; is simply wrong for &quot;let&quot;.</div>
 </div></div><div></div></div></blockquote></div><div><br></div><div>Btw, regarding &quot;let&quot;, ASI, and Dave&#39;s recent &quot;let&quot; expression proposal &lt;<a href="http://wiki.ecmascript.org/doku.php?id=strawman:let_expressions" target="_blank">http://wiki.ecmascript.org/doku.php?id=strawman:let_expressions</a>&gt;, how should</div>
 <div><br></div><div>    let () { =&gt; foo }</div><div>    (3, 4)</div><div><br></div><div>parse? Is it a function call?</div></blockquote><div><br></div></div></div>As far as I can tell, this is covered by ECMA-262 7.9.2:</div>
<div><br></div><div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px">The source</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px"><b><br></b></div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px">
<b>  a = b + c</b></div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px"><b>  (d + e).print()</b></div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px"><br></div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px">is <i>not </i>transformed by automatic semicolon insertion, because the parenthesised expression that begins the second</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px">
line can be interpreted as an argument list for a function call:</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px"><b><br></b></div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px">
<b>  a = b + c(d + e).print()</b></div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px"></div></div></div></blockquote><div><br></div><div><br></div><div>Formally, that makes sense. But given that all the other</div>
<div><br></div><div>    &lt;keyword&gt; ... &quot;{&quot; ... &quot;}&quot;</div><div><br></div><div>productions, if they occur at the beginning of a statement, end with the &quot;}&quot;, I think this reading of the let expression may be confusing. What if we adopt the same (admittedly unpleasant) rule we already have for the &quot;function&quot; keyword: It can&#39;t begin an expression statement. If it occurs at the beginning of a statement, it is a statement. If you want a let expression in that position, surround it with parens.</div>
<div><br></div><div>In other words, better to be unpleasantly consistent than to be inconsistent. (Please no &quot;small mind hobgoblins&quot; ;).)</div><div><br></div><div> </div><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 style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px">In the circumstance that an assignment statement must begin with a left parenthesis, it is a good idea for the</div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px">programmer to provide an explicit semicolon at the end of the preceding statement rather than to rely on automatic</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px">
semicolon insertion.</div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px"><br></div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px"><br></div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px">
<font face="Helvetica"><span style="font-size:medium"><font face="Arial" size="2"><span style="font-size:10px">As David-Sarah Hopwood pointed out a while ago, there&#39;s no error to correct.</span></font></span></font></div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px"><br></div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px">I&#39;m assuming here that let () { =&gt; foo } will be a PrimaryExpression. The always-braced body avoids reduce-reduce conflicts Waldemar pointed out in connection with ES4&#39;s unbracketed let expression body.</div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px"><br></div><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px">/be</div></div><br></div></blockquote></div><br><br clear="all">
<br>-- <br>    Cheers,<br>    --MarkM<br>