<html><body><div style="font-family: arial, helvetica, sans-serif; font-size: 12pt; color: #000000"><div><br></div><div><br></div><hr id="zwchr" data-marker="__DIVIDER__"><div data-marker="__HEADERS__"><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><b>De: </b>"Brian Goetz" <brian.goetz@oracle.com><br><b>À: </b>"Remi Forax" <forax@univ-mlv.fr><br><b>Cc: </b>"amber-spec-experts" <amber-spec-experts@openjdk.java.net><br><b>Envoyé: </b>Jeudi 3 Septembre 2020 20:16:10<br><b>Objet: </b>Re: [pattern-switch] Opting into totality<br></blockquote></div><div data-marker="__QUOTED_TEXT__"><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><font size="+1"><tt>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.</tt></font></blockquote><div><br></div><div>yes, that made sense at the time, the problem is that now we want seom statement switches to be total.<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><font size="+1"><tt><br><br>
        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. </tt></font></blockquote><div><br></div><div>It's not random, arrow switch avoid fallthrough in between cases but weirdly allow a to fallthrough the whole switch.<br data-mce-bogus="1"></div><div>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.<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><font size="+1"><tt> 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.</tt></font></blockquote><div><br></div><div>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.</div><div><br data-mce-bogus="1"></div><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><font size="+1"><tt>  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.  </tt></font></blockquote><div><br></div><div>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.</div><div><br data-mce-bogus="1"></div><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><font size="+1"><tt><br>
        So, I think we got it right then; we just have some holes to
        patch.</tt></font></blockquote><div><br data-mce-bogus="1"></div><div>The problem is that introducing a switch statement that requires totality goes full throttle against the idea that a statement switch implies partiallity.<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div>Rémi<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><br>
    <div class="moz-cite-prefix">On 9/3/2020 1:04 PM, Remi Forax wrote:<br>
    </div>
    <blockquote cite="mid:630127997.639840.1599152672042.JavaMail.zimbra@u-pem.fr">
      
      <div id="zimbraEditorContainer" style="font-family: arial,
        helvetica, sans-serif; font-size: 12pt; color: #000000" class="15">
        <div>I just want to say that the is yet another option,<br>
        </div>
        <div>say that (statement and expression) arrow switches are
          always total.<br>
        </div>
        <div><br>
        </div>
        <div>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.<br>
        </div>
        <div><br>
        </div>
        <div>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 -> {}".<br>
        </div>
        <div><br>
        </div>
        <div>This is an incompatible change with the codes written since
          Java 14 so it's a limited incompatible change.<br>
        </div>
        <div>Perhaps the main blocker is admitting that we were wrong.<br>
        </div>
        <div><br>
        </div>
        <div>Rémi</div>
        <div><br>
        </div>
        <hr id="zwchr">
        <div>
          <blockquote style="border-left:2px solid
#1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><b>De:
            </b>"Brian Goetz" <a class="moz-txt-link-rfc2396E" href="mailto:brian.goetz@oracle.com" target="_blank"><brian.goetz@oracle.com></a><br>
            <b>À: </b>"amber-spec-experts"
            <a class="moz-txt-link-rfc2396E" href="mailto:amber-spec-experts@openjdk.java.net" target="_blank"><amber-spec-experts@openjdk.java.net></a><br>
            <b>Envoyé: </b>Lundi 31 Août 2020 15:25:13<br>
            <b>Objet: </b>Re: [pattern-switch] Opting into totality<br>
          </blockquote>
        </div>
        <div>
          <blockquote style="border-left:2px solid
#1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;">I
            think this is the main open question at this point.  
            <div class=""><br class="">
            </div>
            <div class="">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.  </div>
            <div class=""><br class="">
            </div>
            <div class="">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?  </div>
            <div class=""><br class="">
            </div>
            <div class="">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.  <br class="">
              <div><br class="">
                <blockquote class="">
                  <div class=""><span style="font-family: monospace;
                      font-size: large;" class="">   - How does a switch
                      opt into totality, other than by being an
                      expression switch?</span></div>
                </blockquote>
              </div>
              <br class="">
            </div>
            <br>
          </blockquote>
        </div>
      </div>
    </blockquote>
    <br><br></blockquote></div></div></body></html>