<HTML><HEAD></HEAD>
<BODY 
style="WORD-WRAP: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space" 
dir=ltr>
<DIV dir=ltr>
<DIV style="FONT-FAMILY: 'Segoe UI'; COLOR: #000000; FONT-SIZE: 12pt">
<DIV>We’ve seen many proposals and arguments in the current thread about the 
arrow syntax. While it’s great to start with a brainstorm, the discussion should 
be, at some time, recentered on how to write beautiful lambda expressions. The 
objective of the “short” function syntax [if it once gets implemented] would be 
to have a nicer way to write lambdas (keeping that in mind during the discussion 
is important because, for the other uses, the classical “function” syntax will 
still be applicable).</DIV>
<DIV> </DIV>
<DIV>We all know we have our own prefered syntax based on our tastes and our 
experience with other languages. While the fact that the ECMAScript comitee 
can’t choose something that will make everybody happy, it should at least try to 
evaluate the pro and cons of all possibilities (rejecting a proposal because it 
use a symbol that may be used in the Private Name proposal seems to me a little 
weird, since we also could use another symbol or name in the Private Name 
proposal and/or in the new function notation proposal).</DIV>
<DIV> </DIV>
<DIV>Evaluating the best proposal should be done by :</DIV>
<DIV> </DIV>
<DIV>- identifying use cases of lambdas</DIV>
<DIV> </DIV>
<DIV>- seeing what’s the current patterns used at this time to solve those uses 
cases</DIV>
<DIV>    - in ES today (and in libraries like jQuery, 
Prototype.js, ...)</DIV>
<DIV>    - in other programming languages (seems to have been 
done in large part by the precedent mails)</DIV>
<DIV> </DIV>
<DIV>- seeing how to improve those use cases (and if it’s needed)</DIV>
<DIV> </DIV>
<DIV>- considering what’s the best solution from three point of view :</DIV>
<DIV>    - Compiler     (ease of 
parsing)</DIV>
<DIV>    - 
IDE               
(ease of implementation)</DIV>
<DIV>    - Developer   (readability / 
writability)</DIV>
<DIV> </DIV>
<DIV>Maybe some people in the comitee are already performing that work, so I’ll 
not attempt to go more in depht into this.</DIV>
<DIV> </DIV>
<HR>

<DIV> </DIV>
<DIV>To make some progress on the subject, here’s a little summary of the 
available proposals, at this time :</DIV>
<DIV> </DIV>
<DIV><FONT color=#a5a5a5 size=2 face="Courier New">    // 
CSharp-like syntax</FONT></DIV>
<DIV><FONT size=2 face="Courier New">    array.filter((x) –> 
x.isEmpty); </FONT></DIV>
<DIV><FONT size=2 face="Courier New"></FONT> </DIV>
<DIV><FONT color=#a5a5a5 size=2 face="Courier New">    // 
MatLAB-like syntax</FONT></DIV>
<DIV><FONT size=2 face="Courier New">    array.filter(@(x) 
x.isEmpty);</FONT></DIV>
<DIV><FONT size=2 face="Courier New">    array.filter(#(x) 
x.isEmpty);</FONT></DIV>
<DIV><FONT size=2 face="Courier New"></FONT> </DIV>
<DIV><FONT color=#a5a5a5 size=2 face="Courier New">    // VB-like 
syntax</FONT></DIV>
<DIV><FONT size=2 face="Courier New">    array.filter(function(x) 
x.isEmpty);</FONT></DIV>
<DIV><FONT size=2 face="Courier New">    array.filter(function(x) 
{ return x.isEmtpy; })</FONT></DIV>
<DIV> </DIV>
<DIV>Other proposals were the following (but I suspect the syntax is 
problematic) :</DIV>
<DIV> </DIV>
<DIV><FONT color=#a5a5a5 size=2 face="Courier New">    // 
Ruby-like syntax (?)</FONT></DIV>
<DIV><FONT size=2 face="Courier New">    array.filter({|x| 
x.isEmpty});</FONT></DIV>
<DIV><FONT size=2 face="Courier New">    
array.filter((x){x.isEmpty);</FONT></DIV>
<DIV> </DIV>
<HR>

<DIV> </DIV>
<DIV>I don’t know if it’s derisable, but we could do even shorter (and readable) 
by making the assumption that *if* no argument list is provided, then the lamda 
takes only one named argument (that could be called “a”, considering that no 
good developer would use this single letter as variable names outside lambdas). 
This would allow the following additionnals :</DIV>
<DIV> </DIV>
<DIV><FONT size=2 face="Courier New">    
array.filter(->a.isEmpty);</FONT></DIV>
<DIV><FONT size=2 face="Courier New"></FONT> </DIV>
<DIV><FONT size=2 face="Courier New"></FONT></DIV>
<DIV><FONT size=2 face="Courier New">    
array.filter(@a.isEmpty);</FONT></DIV>
<DIV><FONT size=2 face="Courier New">    
array.filter(#a.isEmpty);</FONT></DIV>
<DIV><FONT size=2 face="Courier New"></FONT> </DIV>
<DIV><FONT size=2 face="Courier New"></FONT></DIV>
<DIV><FONT size=2 face="Courier New">    array.filter(function 
a.isEmpty);</FONT></DIV>
<DIV> </DIV>
<HR>

<DIV> </DIV>
<DIV>As I already previously said, I kinda like the @-proposal [[<FONT size=2 
face="Courier New"> array.filter(@a.isEmpty); </FONT>
<DIV 
style="FONT-STYLE: normal; DISPLAY: inline; FONT-FAMILY: 'Calibri'; COLOR: #000000; FONT-SIZE: small; FONT-WEIGHT: normal; TEXT-DECORATION: none"><FONT 
size=3 face="Segoe UI">]] because it’s very short to write, it’s easy to 
understand, very similar to the current syntax (an important point that the 
arrow syntax completely miss) and can be acustomated to more complex cases like 
[[</FONT></DIV>
<DIV style="FONT: 10pt tahoma"><FONT size=3 face="Segoe UI"></FONT> </DIV>
<DIV style="FONT: 10pt tahoma"><FONT size=2 
face="Courier New">    array.filter(@(childArray,childIndex) 
{<BR>        for(var i=0; 
i<childArray.length; i++) { 
<BR>            if(i%2==0 
&& a[i]<=0) return 
false;<BR>        
}<BR>        return true;<BR></FONT><FONT 
size=2 face="Courier New">    });</FONT></DIV>
<DIV style="FONT: 10pt tahoma"><FONT size=3 face="Segoe UI"></FONT> </DIV>
<DIV style="FONT: 10pt tahoma"><FONT size=3 face="Segoe UI">]]</FONT></DIV>
<DIV style="FONT: 10pt tahoma"><FONT size=3 face="Segoe UI"></FONT> </DIV>
<DIV style="FONT: 10pt tahoma"><FONT size=3 face="Segoe UI">Something to be 
pointed out is that in the case of more complex functions, the most readable way 
is often to create a “true” fuction and use its name as the filter argument 
[[</FONT></DIV>
<DIV style="FONT: 10pt tahoma"><FONT size=3 face="Segoe UI"></FONT> </DIV>
<DIV style="FONT: 10pt tahoma"><FONT face="Courier New">    var 
isValid = @(childArray,childIndex) 
{<BR>        for(var i=0; 
i<childArray.length; i++) { 
<BR>            if(i%2==0 
&& a[i]<=0) return 
false;<BR>        
}<BR>        return true;<BR></FONT><FONT 
face="Courier New">    };</FONT></DIV>
<DIV style="FONT: 10pt tahoma"><FONT face="Courier New"></FONT> </DIV>
<DIV style="FONT: 10pt tahoma"><FONT face="Courier New">    
array.filter(isValid);</FONT></DIV>
<DIV style="FONT: 10pt tahoma"><FONT face="Courier New"></FONT> </DIV>
<DIV style="FONT: 10pt tahoma"><FONT size=3 face="Segoe UI">]] </FONT></DIV>
<DIV style="FONT: 10pt tahoma"><FONT size=3 face="Segoe UI"></FONT> </DIV>
<HR>

<DIV style="FONT: 10pt tahoma"><FONT size=3 face="Segoe UI"></FONT> </DIV>
<DIV style="FONT: 10pt tahoma"><FONT size=3 face="Segoe UI">Another fact used in 
the discussion is that the arrow proposal provides a way to ‘bind’ a lambda to 
an element. Sorry, I’m not sure about why this is useful to have two kind of 
lambdas. A lambda is, most of the time, a function that’s independant of the 
place where’s it is written, used to perform a simple test. The most common use 
of ‘bind’ is to send an object’ function as a callback to an asynchronous code 
(event, ....). In this case, you’ll not create a lambda because the original 
function already exists [[ <FONT size=2 
face="Courier New">el.onclick=this.removeFromParent.bind(this)</FONT> vs <FONT 
size=2 face="Courier New">el.onclick=()=>this.removeFromParent()</FONT> 
]].</FONT></DIV>
<DIV style="FONT: 10pt tahoma"><FONT size=3 face="Segoe UI"></FONT> </DIV>
<DIV style="FONT: 10pt tahoma"><FONT size=3 face="Segoe UI">It’s however 
possible to say that @-function (aka lambdas) are automatically bound to the 
current “this”, if needed. It would allow things like [[ </FONT><FONT 
face="Courier New">array.filter(@this.isValidChild(a));</FONT><FONT size=3 
face="Segoe UI"> ]] to work seamlessy. It would also makes a clear distinction 
between the @ syntax and the “function” syntax, that could justify that both 
coexists (someone’ else complain was about having two syntax to do the same 
thing). </FONT></DIV>
<DIV style="FONT: 10pt tahoma"><FONT size=3 face="Segoe UI"></FONT> </DIV>
<DIV style="FONT: 10pt tahoma"><FONT size=3 face="Segoe UI">This would lead to 
[[ <FONT size=2 
face="Courier New">el.onclick=this.removeFromParent.bind(this)</FONT> vs <FONT 
size=2 face="Courier New">el.onclick=@this.removeFromParent() 
</FONT>]]</FONT></DIV>
<DIV style="FONT: 10pt tahoma"><FONT size=3 face="Segoe UI"></FONT> </DIV>
<DIV style="FONT: 10pt tahoma"><FONT size=3 face="Segoe UI">Hoping this mail can 
help the comitee members to move 
forward,<BR>François</FONT></DIV></DIV></DIV></DIV></BODY></HTML>