yield syntax

David-Sarah Hopwood david-sarah at jacaranda.org
Tue May 19 14:00:23 PDT 2009


Brendan Eich wrote:
> On May 17, 2009, at 6:39 PM, Neil Mix wrote:
>> - we could always allow parenthesis to be dropped when the yield is
>> the entire expression of an expression statement or the right-hand
>> side of an assignment.
> 
> Right-hand side of assignment is ok without parens in Python because
> assignment is a statement.
> 
> In JS if you allow assignment expressions ending in unparenthesized
> yields, then you can have unparenthesized yields in argument and
> initialiser lists, comma expressions, and in the middle and final
> operand positions in ternary (?:) expressions.
> 
>> - in my experience with JS 1.7 I almost always had to parenthesize the
>> yield expression when it was in some other kind of expression.  An in
>> the cases where parenthesis weren't required, I parenthesized anyway
>> to avoid ambiguity and maintain coding style consistency.  (And
>> because I got tired of predicting incorrectly whether or not parens
>> would be required in a particular context.)
> 
> The only contexts we allow you not to parenthesize in JS1.7 are
> assignment expressions and final argument in list. But see above -- the
> assignment expression loophole is big enough to allow
> 
> foo(a = yield b, c);
> 
> One argument, or two?

*If* it is allowed, then it should be two. It would be very surprising if

  foo(a = b, c);

had two arguments (as it does), but the above expression with yield
had one.

But I agree that it may be better not to allow it.

>> So I would argue that there are two syntactical forms of yield, yield
>> E  and (yield E), and that the rules regarding the requirement for
>> parenthesis are hard to predict (from personal experience). 
>> Therefore, I argue that it would make sense to simplify a bit:
>> - the yield E form may be used when it is the entire expression of an
>> expression statement
>> - all other times it must be parenthesized
> 
> Agreed; this closes the assignment expression loophole.

This would disallow

  foo(yield x);

which seems unnecessary.

-- 
David-Sarah Hopwood ⚥



More information about the es-discuss mailing list