Allen's lambda syntax proposal
Brendan Eich
brendan at mozilla.com
Thu Dec 18 08:41:59 PST 2008
On Dec 17, 2008, at 1:42 PM, Lex Spoon wrote:
> I can share some history for the => form. It's disconcerting that
> everyone associates it with C#, because they are open about copying
> the syntax from Scala.
It's for Ecma solidarity -- we are indirectly boosting another Ecma
standard (C# is ECMA-334, IIRC), albeit at the expense of Scala :-P.
Ok, enough of that (we really do not try to align Ecma language
standards, which include Eiffel!). Thanks for the precedent correction.
> On this list, the => form has so far been dismissed due to parsing
> concerns. If that's the only reason, let me try and allay that worry
> and put that horse back in the race. Scala also has a comma operator,
> but it still manages to parse the => syntax. They way it does it is
> to initially parse an expression and then, if it sees a =>,
> reinterpret what it has seen so far as a parameter list. It's an
> unusual parsing strategy, but it works well and the issue is
> localized.
I called the => syntax "no-go" for JS in
https://mail.mozilla.org/pipermail/es-discuss/2008-December/008352.html
cites two general arguments.
First, parsing top-down and then revising the AST based on right
context is do-able -- but the "This can get ugly" remark is meant to
suggest that it's costly compared to choosing a grammar that avoids
the ambiguity.
On the plus side, destructuring in JS1.7, proposed for Harmony to
broad agreement, requires similar revision:
[p, q] = [q, p];
swaps p and q, but it starts like
[p, q];
(and of course could be nested anywhere an assignment expression could
occur).
Let's say we can overcome this objection, by selling the benefit to
the users over the cost to implementors (and users, in minor code
footprint; slippery slope hazard here, otherwise it's not a big cost).
I'm not confident this assumption will hold in committee -- need to
get Waldemar's reaction, at least -- but for now let's just say :-).
The second argument is that the issue may not be localized, especially
in light of automatic semicolon insertion. A counter-example adapted
from the "The trouble with ambiguous grammars" thread:
a => a ? f : x++
(0);
A function expression in JS today is a primary expression, e.g.
var f = function (a) { return a ? f : x++; }
(0);
so lambda users might expect the same precedence.
If the grammar is something like this:
AssignmentExpression:
...
| identifier '=>' AssignmentExpression
| '(' parameters ')' '=>' AssignmentExpression
(which AFAICT from web C# 3.0 grammars is what C# does) then we may be
ok. We'd need to check carefully.
Mono C# seems to have to bend over backwards to parse C# lambdas:
http://tirania.org/blog/archive/2007/Feb-15.html
but I don't see why a bottom-up parser can't decide quite late,
compared to a top-down parser, that it has a lambda parameter list and
not a parenthesized expression.
Perhaps we dismissed the => syntax too quickly, but we need a checked
bottom-up grammar. It's not enough to assert locality, unfortunately,
given the existing grammar and the complexity of automatic semicolon
insertion.
/be
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20081218/23af94cc/attachment.html>
More information about the Es-discuss
mailing list