<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div>On Apr 29, 2010, at 3:16 PM, Mark S. Miller wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">On Thu, Apr 29, 2010 at 2:39 PM, Brendan Eich <span dir="ltr">&lt;<a href="mailto:brendan@mozilla.com">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 class="im"><div><div>Really, methinks you guys protest too much. In particular Mike's "all new productions that introduce a new keyword should be restricted" is simply wrong for "let".</div> </div></div><div></div></div></blockquote></div><div><br></div><div>Btw, regarding "let", ASI, and Dave's recent "let" expression proposal &lt;<a href="http://wiki.ecmascript.org/doku.php?id=strawman:let_expressions">http://wiki.ecmascript.org/doku.php?id=strawman:let_expressions</a>&gt;, how should</div> <div><br></div><div>&nbsp;&nbsp; &nbsp;let () { =&gt; foo }</div><div>&nbsp;&nbsp; &nbsp;(3, 4)</div><div><br></div><div>parse? Is it a function call?</div></blockquote><div><br></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; font: normal normal normal 10px/normal Arial; ">The source</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Arial; "><b><br></b></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Arial; "><b>&nbsp;&nbsp;a = b + c</b></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Arial; "><b>&nbsp;&nbsp;(d + e).print()</b></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Arial; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Arial; ">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; font: normal normal normal 10px/normal Arial; ">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; font: normal normal normal 10px/normal Arial; "><b><br></b></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Arial; "><b>&nbsp;&nbsp;a = b + c(d + e).print()</b></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Arial; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Arial; ">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; font: normal normal normal 10px/normal Arial; ">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; font: normal normal normal 10px/normal Arial; ">semicolon insertion.</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Arial; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Arial; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Arial; "><font class="Apple-style-span" face="Helvetica"><span class="Apple-style-span" style="font-size: medium;"><font class="Apple-style-span" face="Arial" size="2"><span class="Apple-style-span" style="font-size: 10px;">As David-Sarah Hopwood pointed out a while ago, there's no error to correct.</span></font></span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Arial; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Arial; ">I'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's unbracketed let expression body.</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Arial; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Arial; ">/be</div></div><br></body></html>