<html><head>
<meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type">
</head><body bgcolor="#FFFFFF" text="#000000">Sigh. Never mind, I'm 
thinking of statement not expression context -- and you can't start an 
expression statement with {. Parade's back on. :-)<br>
<br>
/be<br>
<br>
<blockquote style="border: 0px none;" 
cite="mid:4F0FA33F.8020609@mozilla.org" type="cite">
  <div style="margin:30px 25px 10px 25px;" class="__pbConvHr"><div 
style="display:table;width:100%;border-top:1px solid 
#EDEEF0;padding-top:5px">       <div 
style="display:table-cell;vertical-align:middle;padding-right:6px;"><img
 photoaddress="brendan@mozilla.org" photoname="Brendan Eich" 
src="cid:part1.02040307.02010906@mozilla.org" name="postbox-contact.jpg"
 height="25px" width="25px"></div>   <div 
style="display:table-cell;white-space:nowrap;vertical-align:middle;width:100%">
        <a moz-do-not-send="true" href="mailto:brendan@mozilla.org" 
style="color:#737F92 
!important;padding-right:6px;font-weight:bold;text-decoration:none 
!important;">Brendan Eich</a></div>   <div 
style="display:table-cell;white-space:nowrap;vertical-align:middle;">   
  <font color="#9FA2A5"><span style="padding-left:6px">January 12, 2012 
7:21 PM</span></font></div></div></div>
  <div style="color:#888888;margin-left:24px;margin-right:24px;" 
__pbrmquotes="true" class="__pbConvBody">
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
Sorry, thought about it 
more and I'm raining on your (and dherman's) parade :-(.<br>
<br>
In an expression but not statement context,<br>
<br>
  ... { (x) <span style="font-style: italic;">e</span>; }<br>
<br>
is already a valid JS program if e begins with (, [, +, or - (the last 
two intended as unary operators but becoming binary).<br>
<br>
Note that | bracketing avoids this problem. In no case can JS of any 
extant version have a legal sequence {|.<br>
<br>
But because {( is already allowed, what comes after the closing ) can be
 the continuation of a parenthesized expression.<br>
<br>
Even if you don't buy my "better to look different because not function"
 argument, this tilts the balance.<br>
<br>
/be<br>

<div>_______________________________________________<br>es-discuss 
mailing list<br><a class="moz-txt-link-abbreviated" href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a><br><a class="moz-txt-link-freetext" href="https://mail.mozilla.org/listinfo/es-discuss">https://mail.mozilla.org/listinfo/es-discuss</a><br></div></div>
  <div style="margin:30px 25px 10px 25px;" class="__pbConvHr"><div 
style="display:table;width:100%;border-top:1px solid 
#EDEEF0;padding-top:5px">       <div 
style="display:table-cell;vertical-align:middle;padding-right:6px;"><img
 photoaddress="brendan@mozilla.org" photoname="Brendan Eich" 
src="cid:part1.02040307.02010906@mozilla.org" name="postbox-contact.jpg"
 height="25px" width="25px"></div>   <div 
style="display:table-cell;white-space:nowrap;vertical-align:middle;width:100%">
        <a moz-do-not-send="true" href="mailto:brendan@mozilla.org" 
style="color:#737F92 
!important;padding-right:6px;font-weight:bold;text-decoration:none 
!important;">Brendan Eich</a></div>   <div 
style="display:table-cell;white-space:nowrap;vertical-align:middle;">   
  <font color="#9FA2A5"><span style="padding-left:6px">January 12, 2012 
4:53 PM</span></font></div></div></div>
  <div style="color:#888888;margin-left:24px;margin-right:24px;" 
__pbrmquotes="true" class="__pbConvBody">
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<span><span>... continuing
 with my sent-too-soon message:<br>
  <br>
</span> </span><span>   function() {
<br>       asyncAction(..., { (a, b) a.add(b); } }
<br>   } 
  <br>
  <br>
You're right, this could be done. Allen's right that aesthetics matter, 
and so (aesthetic sensibilities in various people were formed by these) 
do older languages. Ruby uses || not (). Smalltalk uses | but 
differently, and of course does not use {}.<br>
  <br>
Apart from aesthetics, I argue that || are better because they are 
different from the overloaded () pair, which mean expression grouping in
 the nearby context of the body of the block-lambda, e.g. a.add()b; 
above. () also are used around formal parameter lists. And of course 
they are used for control structure heads, e.g. if (foo).<br>
  <br>
Rather than overloading () yet again, for a different formal parameter 
list context (block-lambda parameter list after {), which is immediately
 adjacent to an expression-statement contexts (the block-lambda body), I
 believe we should use ||.<br>
  <br>
The Ruby precedent is another reason, and a particular reason to use | 
instead of some other candidate. But I'm mainly trying to persuade you 
here that () is not the best choice just because it brackets formal 
parameter lists for functions.<br>
  <br>
/be<br>
</span>
<div class="__pbConvBody" __pbrmquotes="true" 
style="color:#888888;margin-left:24px;margin-right:24px;"><div><br></div></div>
  </div>
  <div style="margin:30px 25px 10px 25px;" class="__pbConvHr"><div 
style="display:table;width:100%;border-top:1px solid 
#EDEEF0;padding-top:5px">       <div 
style="display:table-cell;vertical-align:middle;padding-right:6px;"><img
 photoaddress="brendan@mozilla.org" photoname="Brendan Eich" 
src="cid:part1.02040307.02010906@mozilla.org" name="postbox-contact.jpg"
 height="25px" width="25px"></div>   <div 
style="display:table-cell;white-space:nowrap;vertical-align:middle;width:100%">
        <a moz-do-not-send="true" href="mailto:brendan@mozilla.org" 
style="color:#737F92 
!important;padding-right:6px;font-weight:bold;text-decoration:none 
!important;">Brendan Eich</a></div>   <div 
style="display:table-cell;white-space:nowrap;vertical-align:middle;">   
  <font color="#9FA2A5"><span style="padding-left:6px">January 12, 2012 
2:49 PM</span></font></div></div></div>
  <div style="color:#888888;margin-left:24px;margin-right:24px;" 
__pbrmquotes="true" class="__pbConvBody">
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<br>
<blockquote type="cite" 
cite="mid:8A50647085194FB7B2F65F620A89E445@FREMYD2" style="border: 0px 
none;"><div class="__pbConvHr" style="margin:30px 25px 10px 25px;"><div 
style="display:table;width:100%;border-top:1px solid 
#EDEEF0;padding-top:5px"><div 
style="display:table-cell;white-space:nowrap;vertical-align:middle;width:100%">
        <a style="color:#737F92 
!important;padding-right:6px;font-weight:bold;text-decoration:none 
!important;" href="mailto:fremycompany_pub@yahoo.fr" 
moz-do-not-send="true">François REMY</a></div>   <div 
style="display:table-cell;white-space:nowrap;vertical-align:middle;">   
  <font color="#9FA2A5"><span style="padding-left:6px">January 12, 2012 
2:23 PM</span></font></div></div></div>
  <div class="__pbConvBody" __pbrmquotes="true" style="color: rgb(136, 
136, 136); margin-left: 24px; 
margin-right: 24px;">Am I wrong
 if I say there not a bigger issue with block lambda than with the 
current object notation on the matter?
    <br>
  </div></blockquote>
<br>
Please continue :-).<br>
<blockquote type="cite" 
cite="mid:8A50647085194FB7B2F65F620A89E445@FREMYD2" style="border: 0px 
none;"><div class="__pbConvBody" __pbrmquotes="true" style="color: 
rgb(136, 136, 136); margin-left: 24px; 
margin-right: 24px;">
<br>I mean, does that code mean anything useful?
<br>
<br>   function() {
<br>       {|a,b| a+b};
<br>   }
<br></div></blockquote>
<br>
(You need a name for that function if it is a declaration, and from the 
context you show, it is.)<br>
<br>
Does this perfectly valid JS mean anything useful?<br>
<br>
  function f() {<br>
    (function (a, b) { return a + b; });<br>
  }<br>
<br>
Nevertheless, it is legal. JS follows C (not Java) in allowing seemingly
 useless expression-statements. This can be a source of bugs. It is also
 required in some cases, namely when the function expression (in 
parentheses) is the completion value of a Program. In such a case that 
value could be the wanted result of eval or an eval-like host API.<br>
<blockquote type="cite" 
cite="mid:8A50647085194FB7B2F65F620A89E445@FREMYD2" style="border: 0px 
none;"><div class="__pbConvBody" __pbrmquotes="true" style="color: 
rgb(136, 136, 136); margin-left: 24px; 
margin-right: 24px;">
<br>If not (as it seems to me), it means that a block lambda will not be
 used as 
a statement by itself. If it's the case, it should defined as an 
Expression 
only,</div></blockquote>
<br>
Expression is already a kind of statement, via ExpressionStatement. 
Furthermore, an ExpressionStatement *already* cannot start with a left 
curly brace. Please read the grammar:<br>
<br>
<span style="font-weight: bold;">12.4 Expression Statement</span><br>
<br>
<span style="font-weight: bold;">Syntax</span><br>
<br>
<span style="font-style: italic;">ExpressionStatement</span> :<br>
    [lookahead ∉ {<span style="font-weight: bold;">{</span>, <span 
style="font-weight: bold;">function</span>}] <span style="font-style: 
italic;">Expression</span> <span style="font-weight: bold;">;</span><br>
<br>
NOTE An ExpressionStatement cannot start with an opening curly brace 
because that might make it ambiguous with a Block. Also, an 
ExpressionStatement cannot start with the function keyword because that 
might make it ambiguous with a FunctionDeclaration.<br>
<br>
<blockquote type="cite" 
cite="mid:8A50647085194FB7B2F65F620A89E445@FREMYD2" style="border: 0px 
none;"><div class="__pbConvBody" __pbrmquotes="true" style="color: 
rgb(136, 136, 136); margin-left: 24px; 
margin-right: 24px;"> where 
there's no anonymous block to conflict the syntax.</div></blockquote>
<br>
This is the conflict you're looking for.<br>
<br>
<blockquote type="cite" 
cite="mid:8A50647085194FB7B2F65F620A89E445@FREMYD2" style="border: 0px 
none;">
  <div class="__pbConvBody" __pbrmquotes="true" style="color: rgb(136, 
136, 136); margin-left: 24px; 
margin-right: 24px;">That 
solution 
has been chosen for object notation in the past. That way,
    <br>

<br>   function() {
<br>       {
<br>           (a, b)
<br>           a.add(b)
<br>       }
<br>   }
<br></div></blockquote>
<br>
That is already valid ES1-6.<br>
<br>
Others have already replied, but the problem with redefining ( after { 
without untenable newline sensitivity is it is a backward-incompatible 
change.<br>
<br>
/be
<blockquote type="cite" 
cite="mid:8A50647085194FB7B2F65F620A89E445@FREMYD2" style="border: 0px 
none;">
  <div class="__pbConvBody" __pbrmquotes="true" 
style="color:#888888;margin-left:24px;margin-right:24px;"><div><br></div></div></blockquote>
  </div>
  <div style="margin:30px 25px 10px 25px;" class="__pbConvHr"><div 
style="display:table;width:100%;border-top:1px solid 
#EDEEF0;padding-top:5px">       <div 
style="display:table-cell;vertical-align:middle;padding-right:6px;"><img
 photoaddress="fremycompany_pub@yahoo.fr" photoname="François REMY" 
src="cid:part4.00070000.00020607@mozilla.org" name="postbox-contact.jpg"
 height="25px" width="25px"></div>   <div 
style="display:table-cell;white-space:nowrap;vertical-align:middle;width:100%">
        <a moz-do-not-send="true" href="mailto:fremycompany_pub@yahoo.fr" 
style="color:#737F92 
!important;padding-right:6px;font-weight:bold;text-decoration:none 
!important;">François REMY</a></div>   <div 
style="display:table-cell;white-space:nowrap;vertical-align:middle;">   
  <font color="#9FA2A5"><span style="padding-left:6px">January 12, 2012 
2:23 PM</span></font></div></div></div>
  <div style="color:#888888;margin-left:24px;margin-right:24px;" 
__pbrmquotes="true" class="__pbConvBody">Am I wrong if I say there not a
 bigger issue with block lambda than with the 
current object notation on the matter?
<br>
<br>I mean, does that code mean anything useful?
<br>
<br>   function() {
<br>       {|a,b| a+b};
<br>   }
<br>
<br>If not (as it seems to me), it means that a block lambda will not be
 used as 
a statement by itself. If it's the case, it should defined as an 
Expression 
only, where there's no anonymous block to conflict the syntax. That 
solution 
has been chosen for object notation in the past. That way,
<br>
<br>   function() {
<br>       {
<br>           (a, b)
<br>           a.add(b)
<br>       }
<br>   }
<br>
<br>would still be an anonymous block where
<br>
<br>   function() {
<br>       asyncAction(..., { (a, b) a.add(b); } }
<br>   }
<br>
<br>would be a block lambda as an argument of an async function. No 
semantic 
change for an identical syntax, in regards to strict ES5.
<br>
<br>The case where you would like to use a block lambda as a stament can
 be 
resolved by adding parenthesis, like with the current object notation. 
And 
since I still continue to hope we'll ditch the unprefixed anonymous 
block in 
some future revision of ES, that very small edge case could vanish at 
the 
same time.
<br>
<br>Does it seems possible/acceptable?
<br>
<br>
<br>
<br>
<br>-----Message d'origine----- 
From: Allen Wirfs-Brock
<br>Sent: Thursday, January 12, 2012 10:38 PM
<br>To: Thaddee Tyl
<br>Cc: <a class="moz-txt-link-abbreviated" href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a>
<br>Subject: Re: Block lambda is cool, its syntax isn't
<br>
<br>
<br>On Jan 12, 2012, at 1:26 PM, Thaddee Tyl wrote:
<br>
<br>
<br>but it is ambiguous with  other currently valid statement blocks 
such as:
<br>
<br>  { (a, b) + b}
<br>
<br>or
<br>
<br> { (a,b)
<br>    a+b
<br> }
<br>
<br>Allen
<br>_______________________________________________
<br>es-discuss mailing list
<br><a class="moz-txt-link-abbreviated" href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a>
<br><a class="moz-txt-link-freetext" href="https://mail.mozilla.org/listinfo/es-discuss">https://mail.mozilla.org/listinfo/es-discuss</a> 

<br>_______________________________________________
<br>es-discuss mailing list
<br><a class="moz-txt-link-abbreviated" href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a>
<br><a class="moz-txt-link-freetext" href="https://mail.mozilla.org/listinfo/es-discuss">https://mail.mozilla.org/listinfo/es-discuss</a>
<br>
<br></div>
  <div style="margin:30px 25px 10px 25px;" class="__pbConvHr"><div 
style="display:table;width:100%;border-top:1px solid 
#EDEEF0;padding-top:5px">       <div 
style="display:table-cell;vertical-align:middle;padding-right:6px;"><img
 photoaddress="allen@wirfs-brock.com" photoname="Allen Wirfs-Brock" 
src="cid:part5.05000303.03010605@mozilla.org" name="postbox-contact.jpg"
 height="25px" width="25px"></div>   <div 
style="display:table-cell;white-space:nowrap;vertical-align:middle;width:100%">
        <a moz-do-not-send="true" href="mailto:allen@wirfs-brock.com" 
style="color:#737F92 
!important;padding-right:6px;font-weight:bold;text-decoration:none 
!important;">Allen Wirfs-Brock</a></div>   <div 
style="display:table-cell;white-space:nowrap;vertical-align:middle;">   
  <font color="#9FA2A5"><span style="padding-left:6px">January 12, 2012 
1:38 PM</span></font></div></div></div>
  <div style="color:#888888;margin-left:24px;margin-right:24px;" 
__pbrmquotes="true" class="__pbConvBody"><div><!----><br>but it is 
ambiguous with  other currently valid statement blocks such as:<br><br> 
  { (a, b) + b}<br><br>or<br><br>  { (a,b)<br>     a+b<br>  }<br><br>Allen<br>_______________________________________________<br>es-discuss
 mailing list<br><a class="moz-txt-link-abbreviated" href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a><br><a class="moz-txt-link-freetext" href="https://mail.mozilla.org/listinfo/es-discuss">https://mail.mozilla.org/listinfo/es-discuss</a><br><br></div></div>
</blockquote>
</body></html>