Block lambda is cool, its syntax isn't

Brendan Eich brendan at mozilla.org
Fri Jan 13 10:27:18 PST 2012


> Quildreen Motta <mailto:quildreen at gmail.com>
> January 13, 2012 5:30 AM
> Given those above, despite my usual disliking of Ruby syntax, I prefer
> the pipes over parenthesis, given the latter has an already too
> overloaded semantics, such that `{ (foo, bar) (2) }' would look pretty
> confusing, at least to me. However, what about `{x, y: body}'?

Parameters have optional guards (in the future), default value 
initialisers, destructuring patterns and so on. Using : is no good 
because, while we might manage to keep the grammar unambiguous, it is 
too visually light and is not a close-bracket. It's already used in ?: 
and labels.

> Granted
> we don't allow labels immediately following a lambda block (and I'm
> not sure labels are used much in the language, I could be wrong
> however).

Consider { x, y=a?b:c : body }.

/be
>
> Brendan Eich <mailto:brendan at mozilla.org>
> January 12, 2012 9:20 PM
> We have three coarse-grained alternatives:
>
> 1. λ (params) { body }
>
> 1a. One problem is what should we use for λ? 'lambda', 'block', etc. 
> are not reserved the syntax. Whatever the identifier (including Greek 
> lambda: λ), this is an incompatible change.
>
> 1b. Another problem: this form looks like a function expression with a 
> different introductory keyword, but Tennent's Correspondence Principle 
> makes the meaning of body elements including |this| and 
> return/break/continue radically different. Different-enough semantics 
> should have different syntax.
>
> 2. { (params) body }
>
> Putting the parameter list in parentheses is more consistent with 
> function syntax, while putting the parameters on the inside stresses 
> the block-ness over function-ness. By block-ness I mean (ignoring let, 
> const, and function in Harmony) how code and {code} are equivalent.
>
> Of course this cuts against the syntax too: block statements are not 
> first-class callables whose code bodies are evaluated only if invoked, 
> they are statements evaluated eagerly when reached. This syntax is 
> arguably too block-like.
>
> A point that I remember having come up in past TC39 meetings: if we 
> ever want structuring forms (object literals or destructuring 
> patterns) that use () for grouping property names, this syntax is 
> future hostile.
>
> 3. { |params| body }
>
> This is new-to-JS, idiomatic block-like -- but not too 
> block-statement-like -- syntax for novel body semantics.
>
> The bars will drive some people to distraction. Others will grok, or 
> already do via Ruby. This is not to favor Ruby, just to build on the 
> belief that some precedentin language design is better than none.
>
> We could reject (3) in favor of (2) if we had an overriding 
> non-aesthetic reason. I don't see one.
>
> Aesthetics vary. The more conventional look of (2) seems like a 
> usability hazard to me, which trumps aesthetics. Again I'd rather have 
> something more different-looking to signal the novel application of TCP.
>
> /be
>
> Brendan Eich <mailto:brendan at mozilla.org>
> January 12, 2012 7:23 PM
> Sigh. Never mind, I'm thinking of statement not expression context -- 
> and you can't start an expression statement with {. Parade's back on. :-)
>
> /be
>
> Brendan Eich <mailto:brendan at mozilla.org>
> January 12, 2012 7:21 PM
> Sorry, thought about it more and I'm raining on your (and dherman's) 
> parade :-(.
>
> In an expression but not statement context,
>
>   ... { (x) e; }
>
> is already a valid JS program if e begins with (, [, +, or - (the last 
> two intended as unary operators but becoming binary).
>
> Note that | bracketing avoids this problem. In no case can JS of any 
> extant version have a legal sequence {|.
>
> But because {( is already allowed, what comes after the closing ) can 
> be the continuation of a parenthesized expression.
>
> Even if you don't buy my "better to look different because not 
> function" argument, this tilts the balance.
>
> /be
> Brendan Eich <mailto:brendan at mozilla.org>
> January 12, 2012 4:53 PM
> ... continuing with my sent-too-soon message:
>
>    function() {
>        asyncAction(..., { (a, b) a.add(b); } }
>    }
>
> You're right, this could be done. Allen's right that aesthetics 
> matter, and so (aesthetic sensibilities in various people were formed 
> by these) do older languages. Ruby uses || not (). Smalltalk uses | 
> but differently, and of course does not use {}.
>
> Apart from aesthetics, I argue that || are better because they are 
> different from the overloaded () pair, which mean expression grouping 
> in the nearby context of the body of the block-lambda, e.g. a.add()b; 
> above. () also are used around formal parameter lists. And of course 
> they are used for control structure heads, e.g. if (foo).
>
> Rather than overloading () yet again, for a different formal parameter 
> list context (block-lambda parameter list after {), which is 
> immediately adjacent to an expression-statement contexts (the 
> block-lambda body), I believe we should use ||.
>
> The Ruby precedent is another reason, and a particular reason to use | 
> instead of some other candidate. But I'm mainly trying to persuade you 
> here that () is not the best choice just because it brackets formal 
> parameter lists for functions.
>
> /be
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20120113/4cbffe22/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: postbox-contact.jpg
Type: image/jpeg
Size: 1103 bytes
Desc: not available
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20120113/4cbffe22/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/20120113/4cbffe22/attachment-0003.jpg>


More information about the es-discuss mailing list