We knew at the time we were might want to come back for totality of switches -- not as "fixing a mistake", but providing more type checking when the user asks for it.  So I don't think any of the "but now we realize it is different" applies, nor do I see any new evidence that somehow we missed something substantial then.  (I recall you wanted to do a more aggressive "fix mistakes of the past" option at the time; I think this is mostly taking a second swing along those lines.)

Note that we still have the alternative to do nothing: let the user be on their own with totality for statement switches.  That wasn't a terrible option in 12 (which is why we pushed it off until now), and it's still not really terrible now; it's just that the number of cases of nontrivial totality, and the complexity of the remainder, has gone up and will go up more in the future (enums yesterday; sealed types today; deconstruction patterns tomorrow), which provides some additional pressure for a "total statement switch" option.  Which we could do now, or later, or never.



On 9/3/2020 3:30 PM, fo...@univ-mlv.fr wrote:


------------------------------------------------------------------------

    *De: *"Brian Goetz" <brian.go...@oracle.com>
    *À: *"Remi Forax" <fo...@univ-mlv.fr>
    *Cc: *"amber-spec-experts" <amber-spec-experts@openjdk.java.net>
    *Envoyé: *Jeudi 3 Septembre 2020 20:16:10
    *Objet: *Re: [pattern-switch] Opting into totality

    That came up in the expression switch exploration.  The thinking
    then, which I think is still valid, that it is easier to
    understand the difference when default-totality is attached to the
    expression versions, because expressions _must_ be total and
    statements totally make sense to be partial.


yes, that made sense at the time, the problem is that now we want seom statement switches to be total.



    I think this is still coming from a place of retrospective
    snitch-envy; you want to carve out a corner that has the "right"
    semantics, even if its relation to the other corners is totally
ad-hoc and random.

It's not random, arrow switch avoid fallthrough in between cases but weirdly allow a to fallthrough the whole switch. So it's not about having the semantics right, it's about making the semantics consistent, here the story being able to fall to the next instruction is not consistent.

    The upgrade to switch was driven by orthogonality; totality
    derives from whether the context of the switch (statement vs
    expression) requires totality or embraces partiality.


Very true, but now you are saying that you want to introduce an opt-in to totality for the switch statement, so it's not orthogonal anymore.

      And the kinds of labels are strictly about the treatment of what
    is on the RHS -- either a single { expression/statement } vs
complex control flow.  Which is orthogonal to expression/statement.

The fact that you can implicitly skip the whole switch with arrows it's a complex control flow, , so that part is not fully orthogonal too.


    So, I think we got it right then; we just have some holes to patch.


The problem is that introducing a switch statement that requires totality goes full throttle against the idea that a statement switch implies partiallity.

Rémi



    On 9/3/2020 1:04 PM, Remi Forax wrote:

        I just want to say that the is yet another option,
        say that (statement and expression) arrow switches are always
        total.

        We have introduced the arrow notation to avoid fallthrough but
        we have forgotten one important case of fallthrough, in a
        statement switch when you skip the entire switch, you
        fallthrough the entire switch.

        So we keep supporting the traditional partial switch with no
        modification but requires if a user wants a partial arrow
        switch, to add a "default -> {}".

        This is an incompatible change with the codes written since
        Java 14 so it's a limited incompatible change.
        Perhaps the main blocker is admitting that we were wrong.

        Rémi

        ------------------------------------------------------------------------

            *De: *"Brian Goetz" <brian.go...@oracle.com>
            *À: *"amber-spec-experts"
            <amber-spec-experts@openjdk.java.net>
            *Envoyé: *Lundi 31 Août 2020 15:25:13
            *Objet: *Re: [pattern-switch] Opting into totality

            I think this is the main open question at this point.

            We now have a deeper understanding of what this means, and
            the shape of the remainder.  Totality means not only “spot
            check me that I’m right”, but also “I know there might be
            some remainder, please deal with it.”   So totality is not
            merely about type checking, but about affirmative handling
            of the remainder.

            Expression switches automatically get  this treatment, and
            opting _out_ of that makes no sense for expression
            switches (expressions must be total), but statement
            switches make sense both ways (just like unbalanced and
            balanced if-else.)  Unfortunately the default has to be
            partial,  so the main question is, how  do we indicate the
            desire for totality in a way that is properly evocative
            for the user?

            We’ve talked about modifying switch (sealed switch), a
            hyphenated keyword (total-switch), a trailing modifier
            (switch case), and synthetic cases (“default:
            unreachable”).  Of course at this point it’s “just
            syntax”, but I think our goal should be picking something
            that  makes it obvious to users that what’s going on is
            not merely an assertion of totality, but also a desire to
            handle the remainder.

                 - How does a switch opt into totality, other than by
                being an expression switch?






Reply via email to