On May 13, 2011, at 2:52 PM, Brendan Eich wrote:

> One might be tempted to make an unparenthesized (on the outside) function 
> expression with an unparenthesized expression body be a low-precedence 
> expression (say, AssignmentExpression), but then it can't be used as the 
> callee part of a CallExpression without being parenthesized. Such a 
> low-precedence function expression would have to be parenthesized with every 
> operator save comma.

CoffeeScript does something like this. It separates Invocation from Operation 
(both are Expressions, and an Operation combines Expressions using operators, 
sometimes with a narrower non-terminal than Expression on the left of a dyadic 
operator).

Invocations can be chained but the basis case is a Value as callee nonterminal, 
and a Value must be parenthesized if it contains Code. The Code nonterminal 
produces a CoffeeScript function expression, with optional parenthesized 
parameter list, arrow (-> or =>), and a block body.

The ECMA-262 grammar could be extended like this. It would mean -> and => as 
proposed in 
http://wiki.ecmascript.org/doku.php?id=strawman:arrow_function_syntax would not 
be sugar for existing function expression (with .bind or some tamper-proof 
internal equivalent in the case of =>). But that seems better than requiring 
parentheses.

This grammar interlude reminds me of the grammar dependency graphs at 
http://blog.nicksieger.com/articles/2006/10/27/visualization-of-rubys-grammar 
-- the Java and JavaScript grammars show the C-family expression 
sub-grammar-dependency tower (duplicated in JS's case due to the NoIn 
productions), with all those precedence levels we know and love. Ruby has a 
flatter graph with a popular "primary" non-terminal in the middle.

http://www.flickr.com/photos/nicksieger/280661836/sizes/o/in/photostream/ 
(warning: BIG)

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

The Ruby-ish block (Allen's lambda syntax proposal) approach has to be 
considered, still, since it has braces around the outside and avoids all this 
grammar hacking. The downside is an empty "block" has to be distinguished from 
an empty object initialiser (from an empty block statement :-P). That may not 
be a big downside as Allen noted, although I don't think undefined or null can 
stand in for empty block.

/be
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to