While dodging the arrow, I’ll point out that there is a pleasant ambiguity in 
the following:

    x = switch (y) { 
        case L -> { 
            foo();
            yield 7;
       }
   };

Does the `yield` yield a value to the _block_, or to the _switch_?  Answer: IT 
DOESN”T MATTER!  Whichever intuition feels comfortable to you, yields the right 
answer.  If we think of it as yielding to the block, then the block terminates 
normally with 7, and therefore the case label does, and therefore the switch 
does.  If we think of it as yielding to the switch, then the switch completes 
normally with 7.  And if we later want to expand block expressions to more 
places, maybe with some new syntax, then in a future Java

    case L -> { … }

becomes sugar for

    case L -> BLOCK_COMING { … }

at which point the yield is retconned to yield to the block.  

> On May 16, 2019, at 3:58 PM, John Rose <john.r.r...@oracle.com> wrote:
> 
> On May 16, 2019, at 12:36 PM, Alex Buckley <alex.buck...@oracle.com> wrote:
>> having `yield` as the junior member of that club is quite natural. Putting 
>> the junior and senior members side by side shows both similarity and 
>> difference:
> 
> If junior yield is allowed to help senior return with
> his job, we have a more uniform rule:  yield always
> matches an arrow.
> 
> If junior yield should stay off of senior return's grass,
> we have a somewhat less uniform rule:  yield always
> matches an arrow, unless the arrow is coterminous
> with a method body, in which case return must be
> used.
> 
> Either way is OK with me, but the more uniform rule
> seems to give me more insight into what's really
> happening.
> 
> — John

Reply via email to