On May 23, 2011, at 6:51 PM, Brendan Eich wrote:

> Done, at http://wiki.ecmascript.org/doku.php?id=strawman:block_lambda_revival 
> -- this was easy, but it made me wonder whether parentheses for the plain 
> Expression arguments that may occur after the leading BlockLambda ought not 
> better be curly braces. IOW, instead of
> 
>   bar = foo {|x| x * x} (42);
> 
> support this:
> 
>   bar = foo {|x| x * x} {42};
> 
> This is more uniform on its own new terms. If the first actual parameter 
> wants to be an expression, the programmer must parenthesize the entire 
> argument list (comma separated of course), or else write {| | 42} as the 
> first argument.
> 
> So, are curlies better than parens in this situation? I think it is a bit of 
> a corner case, but good to address to avoid the currying hazard.

Silly of me, tempted by syntactic prettiness but this idea does nothing to 
address your objection.

But here is a grammar change, not too big (and required for yield expressions 
anyway) that does help:

[from 
http://wiki.ecmascript.org/doku.php?id=strawman:arrow_function_syntax#grammar_changes]

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

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

InitialiserNoIn :    // See 12.2
    = InitialValueNoIn

Define InitialValue:

InitialValue :
    AssignmentExpression
    CallWithBlockArguments

Define CallWithBlockArguments:

CallWithBlockArguments :
    CallExpression BlockArguments

extend PrimaryExpression:

PrimaryExpression :
    ...
    ( CallWithBlockArguments )

And BlockArguments as follows:
BlockArguments :
    BlockLambda
    BlockArguments [no LineTerminator here] BlockLambda
    BlockArguments [no LineTerminator here] ( Expression )
The InitialValue non-terminal will also produce YieldExpression for generators, 
already in Harmony.

This is not nearly so bad as "significant surgery of nearly the entire 
expression stack in the grammar", but I may be missing something.

/be
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to