New JEP: Switch Expressions for the Java Language

Ali Ebrahimi ali.ebrahimi1781 at
Mon Dec 11 06:17:11 UTC 2017


> > Your talking about semantics consistency in general, it's not what a
> regular user see, the "syntax to semantics" consistency is more important,
> > if the syntax use an arrow, then the semantics should be the same with
> the other(s) construct(s) that are using an arrow.
> This is a good general principle, and among other things it means we
> should choose a syntax that is evocative of what we want to mean (which
> we’re not fully decided on yet).  If what we mean is “anything goes”, then
> maybe what we should conclude is that -> is a bad choice.  (We certainly
> have “justified” the uncomfortable ambiguity between local and nonlocal
> return by comparison with lambdas).  I think all such choices are
> provisional until we’ve worked out both what we want to have happen, and a
> sensible way to express it, and then ask ourselves if we’re asking too much
> (both semantically and syntactically) of users.  But lets not let the tail
> wag the dog.

I agree that "syntax to semantics" consistency should be preserved and this
was my point in my previous post (may be I was not clear enough).
But my point:

   - expression switches is more similar to statement switches than lambdas

So getting closer that to lambdas unnecessarily make language more complex.
The switch construct (expression/statement) unlike lambdas is a inlined
language construct and don't have standalone scope so returning from this
construct propagates to outer/enclosing construct(for example method) and
changing this old rule surprise java users.


> So, speaking semantically only:
>  - We should not allow fall through in expression switch; I don’t think it
> makes any sense.
>  - I’m pretty convinced that nonlocal returns out of expression switch
> (other than throwing) is similarly a wrong fit.  (We allow this in neither
> conditional expressions nor lambdas.)
>  - Switch expressions should definitely be able to reference locals, but
> we’re open minded to some restrictions (such as no mutation).
>  - We could justify allowing switch expressions to mutate locals, since
> other expressions can too, but we could similarly justify restricting
> mutation
>  - More strongly, we could justify restricting even referencing
> non-eff-final locals, though this is starting to get onto thin ice, because
> the only argument we have for this is “for (superficial) consistency with
> lambdas”, which is pretty weak.
> > and there are several arguments against 2, as you wrote, "it's unlike
> anything else", it forces users to think where the capture occurs exactly
> (my example above) and it's not "syntax to semantics" consistent but this
> can be fixed by not using the arrow symbol.
> If mutation is restricted (which I think is really the first question),
> then there’s no confusion about "where the capture happens”.  So perhaps we
> should examine the basis on which we are willing to justify restricting
> mutation.
The minimal differences we need for expression switches wrt statement

   -   Don't allow fall through in expression switch (break by default):

 compiler implicitly inserts break stats.

   -   Give back value from right hand side picked case clause

But how: Since I disagree with using 'return' for this purpose we have some
options as :
1) *Block expression: *
*The type of the block expression is the type of the last expression it

Foo f = switch (kind) {
    case EMPTY : new Foo();
    case SINGLETON : {
        Foo x = new Foo();
    case MANY : {
        System.out.println("Debugging statement!");

2) *Break by value*

Foo f = switch (kind) {
    case EMPTY : new Foo();   //or *break **new Foo();*
    case SINGLETON : {
        Foo x = new Foo();
        *b**reak *x;
    case MANY : {
        System.out.println("Debugging statement!");
        *break *...

I deliberately not used arrow syntax here to see whether we need it or not.
May be we have other options.......


Best Regards,
Ali Ebrahimi

More information about the amber-spec-observers mailing list