<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<font size="4" face="monospace">As an added bonus, it becomes
practical to get useful exhaustiveness checking for integral types
larger than boolean, as this example with byte shows. </font><br>
<br>
<div class="moz-cite-prefix">On 3/13/2024 12:33 PM, David Alayachew
wrote:<br>
</div>
<blockquote type="cite" cite="mid:CAA9v-_NWF_6x4OaQxGyRmOm7hXkEqL+8dK+7No7PaCabAJPDbw@mail.gmail.com">
<div dir="ltr">
<div class="gmail_default" style="font-family:monospace">Well,
what Brian and RedIO are suggesting would be more like this.</div>
<div class="gmail_default" style="font-family:monospace"><br>
</div>
<div class="gmail_default" style="font-family:monospace">byte b
= 123;<br>
</div>
<div class="gmail_default" style="font-family:monospace"><br>
</div>
<div class="gmail_default" style="font-family:monospace">System.out.println</div>
<div class="gmail_default" style="font-family:monospace">(</div>
<div class="gmail_default" style="font-family:monospace">
switch (b)</div>
<div class="gmail_default" style="font-family:monospace"> {</div>
<div class="gmail_default" style="font-family:monospace"><br>
</div>
<div class="gmail_default" style="font-family:monospace">
case -128..-1 -> "It's negative!";</div>
<div class="gmail_default" style="font-family:monospace">
case 0 -> "It's zero!";<br>
</div>
<div class="gmail_default" style="font-family:monospace">
<div class="gmail_default" style="font-family:monospace">
case 1..127 -> "It's positive!";</div>
</div>
<div class="gmail_default" style="font-family:monospace"><br>
</div>
<div class="gmail_default" style="font-family:monospace"> }</div>
<div class="gmail_default" style="font-family:monospace">)</div>
<div class="gmail_default" style="font-family:monospace">;<br>
</div>
<div class="gmail_default" style="font-family:monospace"><br>
</div>
<div class="gmail_default" style="font-family:monospace">The
difference is, in this example, it would be EXHAUSTIVE, NO
DEFAULT CLAUSE NECESSARY. Your example requires either a
default or a type pattern to be exhaustive, as do basically
all switches that use when clauses.</div>
<div class="gmail_default" style="font-family:monospace"><br>
</div>
<div class="gmail_default" style="font-family:monospace">That
exhaustiveness is powerful because -- patterns compose. For
example, if you have a complex set of number checks, this
switch will tell you if you left a value out. That is the
power of exhaustiveness. When you combine it with composition,
you can take an arbitrarily complex domain, and the compiler
will let you know if you missed a case.<br>
</div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Wed, Mar 13, 2024 at
12:13 PM Josiah Noel <<a href="mailto:josiahnoel@gmail.com" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">josiahnoel@gmail.com</a>>
wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">we sorta have this with switch guards
<div><br>
</div>
<div>
<div style="background-color:rgb(28,31,34);padding:0px 0px 0px 2px">
<div style="color:rgb(199,205,209);font-family:Consolas;white-space:pre-wrap"><p style="margin:0px"><span style="color:rgb(207,191,173)"> </span><span style="color:rgb(255,0,127)">switch</span><span style="color:rgb(207,191,173)"> </span><span style="color:rgb(249,250,244)">(</span><span style="color:rgb(207,191,173)">intyMcIntFace</span><span style="color:rgb(249,250,244)">)</span><span style="color:rgb(207,191,173)"> </span><span style="color:rgb(249,250,244)">{</span></p><p style="margin:0px"><span style="color:rgb(207,191,173)"> </span><span style="color:rgb(255,0,127)">case</span><span style="color:rgb(207,191,173)"> </span><span style="color:rgb(82,227,246)">Integer</span><span style="color:rgb(207,191,173)"> i </span><span style="color:rgb(197,104,28)">when</span><span style="color:rgb(207,191,173)"> i </span><span style="color:rgb(255,0,127)">></span><span style="color:rgb(207,191,173)"> </span><span style="color:rgb(196,140,255)">1</span><span style="color:rgb(207,191,173)"> </span><span style="color:rgb(255,0,127)">&&</span><span style="color:rgb(207,191,173)"> i </span><span style="color:rgb(255,0,127)"><</span><span style="color:rgb(207,191,173)"> </span><span style="color:rgb(196,140,255)">10</span><span style="color:rgb(207,191,173)"> </span><span style="color:rgb(255,0,127)">-></span><span style="color:rgb(207,191,173)"> </span><span style="color:rgb(249,250,244)">{}</span></p><p style="margin:0px"><span style="color:rgb(207,191,173)"> </span></p><p style="margin:0px"><span style="color:rgb(207,191,173)"> </span><span style="color:rgb(255,0,127)">case</span><span style="color:rgb(207,191,173)"> </span><span style="color:rgb(196,140,255)">42</span><span style="color:rgb(207,191,173)"> </span><span style="color:rgb(255,0,127)">-></span><span style="color:rgb(207,191,173)"> </span><span style="color:rgb(249,250,244)">{}</span></p><p style="margin:0px">
</p><p style="margin:0px"><span style="color:rgb(207,191,173)"> </span><span style="color:rgb(255,0,127)">default</span><span style="color:rgb(207,191,173)"> </span><span style="color:rgb(255,0,127)">-></span><span style="color:rgb(207,191,173)"> </span><span style="color:rgb(255,0,127)">throw</span><span style="color:rgb(207,191,173)"> </span><span style="color:rgb(255,0,127)">new</span><span style="color:rgb(207,191,173)"> </span><span style="color:rgb(167,236,33)">IllegalArgumentException</span><span style="color:rgb(249,250,244)">(</span><span style="color:rgb(236,228,126)">"Unexpected value: "</span><span style="color:rgb(249,250,244)">)</span><span style="color:rgb(255,0,127)">;</span></p><p style="margin:0px"><span style="color:rgb(207,191,173)"> </span><span style="color:rgb(249,250,244)">}</span></p></div>
</div>
</div>
</div>
</div>
<input name="virtru-metadata" type="hidden" value="{"email-policy":{"disableCopyPaste":false,"disablePrint":false,"disableForwarding":false,"enableNoauth":false,"expandedWatermarking":false,"expires":false,"sms":false,"expirationNum":1,"expirationUnit":"days","isManaged":false,"persistentProtection":false},"attachments":{},"compose-id":"3","compose-window":{"secure":false}}"></div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Wed, Mar 13, 2024 at
8:16 AM Red IO <<a href="mailto:redio.development@gmail.com" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">redio.development@gmail.com</a>>
wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div dir="auto">The switch statement saw a huge
transformation over the past few releases. So I was
quite surprised to realize that the current switch
construct can't check the range of an value.
<div dir="auto">Example case x is between y and z.</div>
<div dir="auto">I'm most likely not the first one to
notice that. Is there any discussion about adding
some sort of range pattern? Would fit in the notion
of the switch checking patterns quite well. </div>
<div dir="auto"><br>
</div>
<div dir="auto">Great regards </div>
<div dir="auto">RedIODev </div>
</div>
</blockquote>
</div>
</div>
</blockquote>
</div>
</blockquote>
<br>
</body>
</html>