New JEP: Switch Expressions for the Java Language

Brian Goetz brian.goetz at oracle.com
Mon Dec 11 15:35:04 UTC 2017


A request please, folks: if you're going to reply to the observers list, 
please don't copy the individual EG members directly.  It should be 
their choice whether they are involved in -observers discussions or not.

On this particular message: let's figure out the right semantics before 
we redesign the syntax.  (FYI: both of these syntax options were already 
considered.)

On 12/11/2017 1:17 AM, Ali Ebrahimi wrote:
> Hi,
>
>     >
>     > 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 
> switches:
>
>   *   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 encloses*
> |Foo f = switch (kind) { case EMPTY : new Foo(); case SINGLETON : { Foo 
> x = new Foo(); x.add(ONE); x; } 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(); x.add(ONE); *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