On May 13, 2011, at 11:25 PM, Brendan Eich wrote:

> I'll update 
> http://wiki.ecmascript.org/doku.php?id=strawman:arrow_function_syntax to 
> include an ES5 grammar patch.

Done: http://wiki.ecmascript.org/doku.php?id=strawman:arrow_function_syntax, 
specifically 
http://wiki.ecmascript.org/doku.php?id=strawman:arrow_function_syntax#grammar_changes

This requires splitting the sub-grammar starting at Expression (comma 
expression), at AssignmentExpression (which occurs in all comma-separated list 
non-comma-expression contexts, namely argument lists and initialisers), 
creating a parallel production chain from Statement through AssignmentStatement.

Many languages restrict assignment to statement form. We don't need to do that 
and shouldn't break extant code that nests assignment expressions, but 
separating assignment statements (comma-separated lists of assignments) enables 
better right-hand side syntax for arrow function expressions -- namely, they 
don't have to be parenthesized.

Thus you can write

array.map((elem) -> elem * elem)
let identity = (x) -> x;
thrice = (x) -> 3 * x;

without gratuitous parenthesization. Calling an arrow function expression 
requires parentheses on the outside, of course:

alert((-> "paren me")());

Comments welcome, I haven't had time to formalize and test this but it looks 
like it will work.

/be

Grammar Changes

Change all uses of AssignmentExpression outside of the Expression sub-grammar 
to InitialExpression:

ElementList :        // See 11.1.4
    Elisionopt InitialExpression
    ElementList , Elisionopt InitialExpression
 ...
PropertyAssignment : // See 11.1.5
    PropertyName : InitialExpression
 ...
ArgumentList :       // See 11.2
    InitialExpression
    ArgumentList , InitialExpression
 ...
Initialiser :        // See 12.2
    = InitialExpression

InitialiserNoIn :    // See 12.2
    = InitialExpressionNoIn
Define InitialExpression and ArrowFunctionExpression:

InitialExpression :
    AssignmentExpression
    ArrowFunctionExpression

ArrowFunctionExpression :
    FormalParametersOpt Arrow [lookahead ∉ {{}] InitialExpression
    FormalParametersOpt Arrow Block

FormalParameters :
    ( FormalParameterListOpt )
    
Arrow : one of -> or =>

Split assignment out of ExpressionStatement into AssignmentStatement:

Statement :
    Block
    VariableStatement
    EmptyStatement
    AssignmentStatement
    ExpressionStatement
    ...

AssignmentStatement :
    [lookahead ∉ {{, function}] AssignmentList ;

AssignmentList :
    Assignment
    AssignmentList , Assignment

Assignment :
    LeftHandSideExpression = InitialExpression
    LeftHandSideExpression AssignmentOperator InitialExpression

ExpressionStatement :
    [lookahead ∉ {{, function}] ConditionalExpression ;
Finally, PrimaryExpression produces a parenthesized ArrowFunctionExpression:

PrimaryExpression :
    ...
    ( ArrowFunctionExpression )
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to