Block lambda grammar: BlockArguments

Brendan Eich brendan at mozilla.org
Sat Jan 14 09:41:34 PST 2012


> Axel Rauschmayer <mailto:axel at rauschma.de>
> January 13, 2012 9:09 PM
>
> If I read the grammar correctly, then you can do things such as (read 
> "~~~>" as "desugars to"):
>
>      myfunc {|| } {|| } (arg3) (arg4)  ~~~>  myfunc({|| }, {|| }, 
> arg3, arg4)
>
> The above is a function call with 4 arguments. My wish would be 
> different: I would want to put lambdas after a function or method call 
> and treat those lambdas as additional arguments:
>
>      myfunc(arg1, arg2) {|| } {|| }  ~~~>  myfunc(arg1, arg2, {|| }, 
> {|| })
>      myfunc {|| } {|| }  ~~~>  myfunc({|| }, {|| })

The closing parenthesis after arg2 really ought to mean end of formal 
parameter list. Anything else is too magical.
>
> Rationale: I would always make lambdas trailing arguments, similar to
>      if (cond) {} {}
> And I would rather achieve this effect without currying.

Why should foo(arg1)(arg2) and foo(arg1){||arg2} differ?

Your use-case is satisfied by returning a function (memoized, singleton 
even), but the symmetry between (arg1, ... argN) and space-separated 
BlockArguments should not be broken.

> Following a block with a non-block doesn’t seem like a good idea.

This was an explicit goal, in order to support use-cases including 
setTimeout and promises APIs.
>
> Has the other approach been considered?

Yes, see

https://mail.mozilla.org/pipermail/es-discuss/2011-May/014675.html

/be
>
> -- 
> Dr. Axel Rauschmayer
> axel at rauschma.de <mailto:axel at rauschma.de>
>
> home: rauschma.de <http://rauschma.de>
> twitter: twitter.com/rauschma <http://twitter.com/rauschma>
> blog: 2ality.com <http://2ality.com>
>
> Brendan Eich <mailto:brendan at mozilla.org>
> January 13, 2012 12:58 PM
> Fixed: 
> http://wiki.ecmascript.org/doku.php?id=strawman:block_lambda_revival&do=diff
>
> The LeftHandSideExpression productions and their kids (NewExpression 
> and CallExpression) are funky and I keep misremembering how 
> NewExpression is what bottoms out via MemberExpression -> 
> PrimaryExpression at Identifier.
>
> /be
>
> Brendan Eich <mailto:brendan at mozilla.org>
> January 12, 2012 11:43 PM
>> Brendan Eich <mailto:brendan at mozilla.org>
>> January 12, 2012 11:39 PM
>>   v.map {|e| e*e}
>
> Er, not even that -- Arguments required in a CallExpression, so 
> v().map or v.map() but not just v.map. Fixes coming tomorrow.
>
> /be
>>
>> or
>>
>>   get_map() {|e| e*e}
>>
>> or similar. I will fix.
>>
>> /be
>> _______________________________________________
>> es-discuss mailing list
>> es-discuss at mozilla.org
>> https://mail.mozilla.org/listinfo/es-discuss
>> Axel Rauschmayer <mailto:axel at rauschma.de>
>> January 12, 2012 11:16 PM
>> http://wiki.ecmascript.org/doku.php?id=strawman:block_lambda_revival
>>
>> I’m trying to understand the syntax:
>> BlockArguments :
>> BlockLambda
>> BlockArguments [no LineTerminator here] BlockLambda
>> BlockArguments [no LineTerminator here] ( InitialValue )
>>
>> - Wouldn’t this allow the following? BlockLambda [no LineTerminator 
>> here] BlockLambda
>> - InitialValue means that paren-free can be combined with arguments 
>> that aren’t blocks, right?
>>
>> myLoopFunc(initValue1)(initValue2) { | arg1, arg2 | ... }
>>
>> I think I would prefer the following (IIRC, more like Ruby):
>>
>> myLoopFunc(initValue1, initValue2) { | arg1, arg2 | ... }
>>
>>
>>
> Brendan Eich <mailto:brendan at mozilla.org>
> January 12, 2012 11:39 PM
>> Axel Rauschmayer <mailto:axel at rauschma.de>
>> January 12, 2012 11:16 PM
>> http://wiki.ecmascript.org/doku.php?id=strawman:block_lambda_revival
>>
>> I’m trying to understand the syntax:
>> BlockArguments :
>>      BlockLambda
>>      BlockArguments [no LineTerminator here] BlockLambda
>>      BlockArguments [no LineTerminator here] ( InitialValue )
>>
>> - Wouldn’t this allow the following? BlockLambda [no LineTerminator 
>> here] BlockLambda
>
> Yes.
>
>> - InitialValue means that paren-free can be combined with arguments 
>> that aren’t blocks, right?
>
> Yes.
>>
>> myLoopFunc(initValue1)(initValue2) { | arg1, arg2 | ... }
>
> No, the myLoopFunc(initValue1) is a CallExpression -- see
> CallWithBlockArguments :
>      CallExpression [no LineTerminator here] BlockArguments
>   
> The *return value* of that ordinary CallExpression is the callee of the paren-free call.
>>
>> I think I would prefer the following (IIRC, more like Ruby):
>>
>> myLoopFunc(initValue1, initValue2) { | arg1, arg2 | ... }
>>
>
> That parses, as described above. The two-argument CallExpression must 
> return a function that takes the block arguments.
>
> I see a problem in the grammar in the strawman, now that you mention 
> it: no way to produce a simple identifier callee from CallExpression, 
> so no
>
>   map {|e| e*e}
>
> only
>
>   v.map {|e| e*e}
>
> or
>
>   get_map() {|e| e*e}
>
> or similar. I will fix.
>
> /be
> Axel Rauschmayer <mailto:axel at rauschma.de>
> January 12, 2012 11:16 PM
> http://wiki.ecmascript.org/doku.php?id=strawman:block_lambda_revival
>
> I’m trying to understand the syntax:
> BlockArguments :
> BlockLambda
> BlockArguments [no LineTerminator here] BlockLambda
> BlockArguments [no LineTerminator here] ( InitialValue )
>
> - Wouldn’t this allow the following? BlockLambda [no LineTerminator 
> here] BlockLambda
> - InitialValue means that paren-free can be combined with arguments 
> that aren’t blocks, right?
>
> myLoopFunc(initValue1)(initValue2) { | arg1, arg2 | ... }
>
> I think I would prefer the following (IIRC, more like Ruby):
>
> myLoopFunc(initValue1, initValue2) { | arg1, arg2 | ... }
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20120114/bc501988/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: postbox-contact.jpg
Type: image/jpeg
Size: 1222 bytes
Desc: not available
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20120114/bc501988/attachment-0002.jpg>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: postbox-contact.jpg
Type: image/jpeg
Size: 1290 bytes
Desc: not available
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20120114/bc501988/attachment-0003.jpg>


More information about the es-discuss mailing list