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