Created
May 8, 2011 16:51
-
-
Save rwaldron/961495 to your computer and use it in GitHub Desktop.
Thinking outloud, exploring ideas that might compete with # or -> as function shorthands. Recreating examples form http://wiki.ecmascript.org/doku.php?id=strawman:arrow_function_syntax
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
( ( <argument-list> ) <expression> | <block> ) | |
var identity = (( x ) { | |
x; // with tail calls | |
}); | |
var f = (( a, b, c ) { | |
// a, b, c | |
}); | |
f( a, b, c ); | |
var obj = { | |
f: () { | |
// who needs a label? | |
} | |
}; | |
obj.f(); | |
otherFunction( "arg", ( /.../ ) { | |
// used as a callback | |
}); | |
// The following adapted from `strawman:arrow_function_syntax` | |
// Primary expression body [...] | |
let identity = ( (x) { x } ); | |
// ...or...? | |
let identity = ( (x) x ); // bad | |
// Lower-precedence expression with body. curly braces? | |
let square = ( (x) { x * x } ); | |
// ...or...? | |
let square = ( (x) x * x ); // bad | |
// In cases where a function expression is expected, outer parens are omitted | |
setTimeout( () { | |
// do stuff | |
}, 1000 ); | |
// returning, nesting & closures (narcissus parser testing) | |
(function( global ) { | |
global.Module = (() { | |
var identity = ((x) { x }), | |
square = ((x) { x * x }), | |
hasFoo = (( obj ) { | |
var ret = "no foo"; | |
if ( obj.foo ) { | |
ret = "has foo"; | |
} | |
ret; | |
}); | |
return { | |
hasFoo: hasFoo, | |
identity: identity, | |
square: square | |
}; | |
})(); | |
})( this ); |
let identity = (x) { x };
Doesn't work due to ASI after the parenthesized expression.
let identity = ( (x) x );
Doesn't work due to UnaryExpression, e.g. consider ((x) +x). Parenthesizing won't help here, because that'd turn the expression into a CallExpression, e.g. ((x) (+x)).
( (arglist) { body } )
Should work for FunctionDeclaration/FunctionExpression, but requires a lookahead. That means the parser needs to tokenize the complete input until it reaches the "{" token to decide whether to parse the input as a FunctionDeclaration/FunctionExpression or a PrimaryExpression.
Thanks! That's very helpful, as I'm working on implementing these ideas in Narcissus and this feedback is incredibly useful
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
To be honest, I'm not sure. I'm actually trying to work it into a local branch of Narcissus to see if I can show it in action