> On May 16, 2019, at 3:36 PM, Alex Buckley <alex.buck...@oracle.com> wrote:
>
> On 5/16/2019 8:24 AM, Brian Goetz wrote:
>> We’ve probably pretty much explored the options at this point; time to
>> converge around one of the choices...
>
> I am very happy with `yield` as the new construct for concluding the
> evaluation of a switch expression and leaving a value on the stack for
> consumption within the method.
>
Yah, okay, I now admit that “yield” is growing on me. I no longer object to it.
And your other points below are well taken.
> I think a statement form for the new construct is ideal. The purpose of the
> new construct is to complete abruptly in an attempt to transfer control back
> to the switch expression, which then completes normally with a value. Abrupt
> completion and an attempt to transfer control are the hallmarks of `break`,
> `continue`, and `return`; 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:
>
> -----
> A `yield` statement attempts to transfer control to the innermost enclosing
> switch expression; this expression ... then immediately completes normally
> and the value of the _Expression_ becomes the value of the switch expression.
>
> A `return` statement attempts to transfer control to the invoker of the
> innermost enclosing constructor, method, or lambda expression ... In the case
> of a return statement with value _Expression_, the value of the _Expression_
> becomes the value of the invocation.
> -----
>
> Note that the aspect of _attempting_ to transfer control applies to `yield`
> just as much as to `break`, `continue`, and `return`. Below, the `finally`
> block "intercepts" the transfer of control started by `yield`. The `finally`
> block then completes normally, so the transfer of control proceeds and the
> switch expression completes normally, leaving 5 or 6 on the stack.
>
> ```
> int result = switch (x) {
> case 0 -> {
> try {
> ...
> if (...) yield 5;
> ...
> yield 6;
> }
> finally {
> cleanUp();
> }
> }
>
> default -> 42;
> };
> ```
>
> Abrupt completion and transfer of control are not the hallmarks of operators.
> The purpose of an operator is to indicate the kind of expression to be
> evaluated (numeric addition, method invocation, etc), so an operator-like
> syntax such as `^` would suggest the imminent evaluation of a NEW expression.
> However, we are ALREADY in the process of evaluating a switch expression; in
> fact we would like to finish it up by transferring control from the {...}
> block (which has been happily executing statements sequentially) to the
> switch expression itself (so it can complete normally). So, I think an
> operator-like syntax is inappropriate.
>
> Alex