<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Apr 23, 2018, at 2:02 PM, Kevin Bourrillion <<a href="mailto:kevinb@google.com" class="">kevinb@google.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><div class="gmail_extra"><div class="gmail_quote">On Fri, Apr 20, 2018 at 11:55 AM, Guy Steele <span dir="ltr" class=""><<a href="mailto:guy.steele@oracle.com" target="_blank" class="">guy.steele@oracle.com</a>></span> wrote:</div><div class="gmail_quote"><br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class=""><div class="">You know, if s2 is short (say, less than 30 or 40 characters), there are worse things than writing</div><div class=""><br class=""></div><div class=""><font face="Courier" class="">         case A -> s1;</font></div><div class=""><font face="Courier" class="">         case null -> s2;</font></div><div class=""><span style="font-family:Courier" class="">         default   -> s2;</span></div><div class=""><br class=""></div><div class="">especially if you use spaces (as I just did) to line up the two occurrences of s2 to make it easy to see they are identical.</div><div class=""><br class=""></div><div class="">And if s2 is long, there are worse things than making a little sub method to handle it:</div><div class=""><br class=""></div><div class=""><div class=""><font face="Courier" class="">         case A -> s1;</font></div><div class=""><font face="Courier" class="">         case null -> frobboz(a, b);</font></div><div class=""><font face="Courier" class="">         default   -> frobboz(a, b);</font></div></div><div class=""><font face="Courier" class=""><br class=""></font></div><div class=""><font face="Courier" class="">    int frobboz(int a, String b) { … }</font></div><div class=""><br class=""></div><div class="">And if even THAT is not satisfactory, well, there are worse things than giving up on the arrows and just using colons (and break, if needed).</div></div></blockquote><div class=""><br class=""></div><div class="">I think neither of these goes down well. Having to repeat yourself at all, while normal cases get to use comma, will feel very wrong. Having to abandon arrowform over this would be even worse.</div><div class=""><br class=""></div><div class=""><br class=""></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class=""><div class="">BUT, on the other hand, if we wanted to: instead of, or in addition to,<br class=""></div><div class=""><br class=""></div><div class=""><font face="Courier" class="">        case pat1, pat2, pat3 -> s;</font></div><div class=""><br class=""></div><div class="">we could allow the form</div><div class=""><br class=""></div><div class=""><div class=""><font face="Courier" class="">        case pat1 -> case pat2 -> case pat3 -> s;</font></div></div></div></blockquote><div class=""><br class=""></div><div class="">This seems like a step backward to me (whether it is instead or in addition).</div><div class=""><br class=""></div><div class="">fwiw, I think `default, case null ->` is superior to all of these options.</div></div></div></div></div></blockquote><br class=""></div><div>As an ad-hoc patch that solves this one problem, I agree.</div><div><br class=""></div><div>But let me make a revised pitch for allowing it “in addition to” (which, now that I have pondered it over the weekend, I think is clearly the correct approach).</div><div><br class=""></div><div>(1) We have moved toward allowing “arrow versus colon” to be a syntax choice that is COMPLETELY orthogonal to other choices about the use of `switch`.  If this rule is to hold universally, then any switch statement or expression should be convertible between the arrow form and the colon form using a simple, uniform rule.</div><div><br class=""></div><div>(2) In switch expressions we want to be able to use the concise notation `case a, b, c -> s;` for a switch clause.</div><div><br class=""></div><div>(3) From (1) and (2) we inexorably conclude that `case a, b, c: break s;` must also be a valid syntax.</div><div><br class=""></div><div>(4) But we could also have written (3) as `case a: case b: case c: break s;` and we certainly expect them to have equivalent behavior.</div><div><br class=""></div><div>(5) From (1) and (4) we conclude that we ought also be to be able to write `case a -> case b -> case c -> s;`.</div><div><br class=""></div><div>Notice that so far I have said nothing about the “default and null” problem being a motivation.  It’s all about preserving assumption (1).</div><div><br class=""></div><div>The issue with default and null has nothing to do with the issue of arrow versus colon.  It *does* have to do with the issue of repeating the `case` keyword versus listing multiple values (or patterns) by using commas after a single `case` keyword: `default` does not play well with the comma-separated case when you use colons, so there is no reason to expect it to play well when you use arrows.  Trying to make a special-case exception for `default` in the arrow case requires making a similarly ugly exception in the colon case if assumption (1) is to be preserved.</div><div><br class=""></div><div>I argue that there is no need to make the special-case exception for `default`.  When you need to play that game (usually because null needs to be addressed), you cannot use the comma-separation syntax.  Instead, just say either</div><div><br class=""></div><div><span class="Apple-tab-span" style="white-space:pre">     </span>case null: default: s;<span class="Apple-tab-span" style="white-space:pre">                      </span>(or, if you prefer, `default: case null: s;`)</div><div><br class=""></div><div>or</div><div><br class=""></div><div><span class="Apple-tab-span" style="white-space:pre">       </span>case null -> default -> s;<span class="Apple-tab-span" style="white-space:pre">            </span>(or, if you prefer, `default -> case null -> s;`)</div><div><br class=""></div><div>depending on whether your `switch` is using colon syntax or arrow syntax.  The latter is just two characters longer than `default, case null -> s;` and has a much simpler and more consistent underlying theory.</div><div><br class=""></div><div>—Guy</div><div><br class=""></div></body></html>