On May 14, 2009, at 1:14 PM, Neil Mix wrote:

On May 14, 2009, at 2:38 PM, Brendan Eich wrote:

Indeed the low-precedence (same as assignment) nature of the yield unary caused JS1.7 to follow Python in requiring parentheses around yield expressions in lists: in comma expressions and actual parameter lists (although we diverged from Python by allowing an unparenthesized yield expression as the last actual argument in a call or new expression's parameter list -- Python requires foo((yield bar)) instead of foo(yield bar)).

I have this idea that it would be better for yield expressions to look like function calls: 'yield' '(' expression? ')'. (Note that this is only a syntactical suggestion; clearly an implementation wouldn't actually treat it like a function.) That would eliminate the precedence issues Brendan cites while also making the syntax backward compatible with earlier ES parsers. Is there any technical reason why that wouldn't be possible?

The syntax could work but we need to reserve yield contextually. It can't be a user-defined function name and a built-in function. The compiler must unambiguously know that yield (the built-in) is being called in order to make the enclosing function a generator.

This is reason enough in my view to keep yield a prefix operator and reserve it. I wish I had done that with eval in JS1.0!

Another reason is your duck/cow point, which I think is a separate point from compiler analyzability. Really, no one writes yield(...) in Python, and extra parens hurt (I know RSI sufferers who benefit from lack of shifting in Python and Ruby).

Now you could argue that we have eval already, and a cheap-ish way to detect direct calls to it (see https://mail.mozilla.org/pipermail/es-discuss/2009-January/008656.html) , so why not add something like that again? One reason is that the cost is not zero -- cheap-ish, not cheap and not free. Adding more distinguished special-form instructions that fall back on call behavior if the callee is not the magic built-in will annoy implementors.

But you do make a good no-new-syntax case, ignoring the above considerations. I still don't buy it, given let not being doable the same way. We need new keywords and special forms (not many, but it's absurd to freeze the set from ES3 in 1999).

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

Reply via email to