<div dir="ltr">On Sun, Jul 10, 2016 at 10:48 PM, Erica Sadun <span dir="ltr">&lt;<a href="mailto:erica@ericasadun.com" target="_blank">erica@ericasadun.com</a>&gt;</span> wrote:<div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class=""><br>
&gt; On Jul 10, 2016, at 8:37 PM, Xiaodi Wu &lt;<a href="mailto:xiaodi.wu@gmail.com">xiaodi.wu@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt; This is a neat idea, and I think a very sensible way to extend the language. I worry only a little about the following:<br>
&gt;<br>
&gt; Currently, unless preceded immediately by the keyword `fallthrough`, a condition implicitly excludes all previous conditions. That is, if I write `switch .. { case a: ...; case b: ...; case c: ... }`, my condition `c` is really `!a &amp;&amp; !b &amp;&amp; c`. With more flexible control flow within a switch statement, reasoning about what cases are matched by any particular condition after the first becomes increasingly difficult.<br>
<br>
</span>In the current Swift, absent `fallthrough`, the statement execution ends and no other statements are evaluated after the first match.<br>
<br>
With `fallthrough` the current clause executes and the next clause executes, and then the statement execution ends.<br>
<br>
With `continue`, the current clause executes and the switch continues searching for a matching pattern as if a pattern has not yet been matched.<span class=""><font color="#888888"><br></font></span></blockquote><div><br></div><div>I understand. What I&#39;m saying is that control flow becomes more difficult to reason through in a scenario as follows, which is not possible currently:</div><div><br></div><div>Given patterns A, B, C, and D, suppose a value x matches A, C, and D, whereas another value y matches B and D, and a third value matches B and C. When evaluating x, y, or z, which statements are executed in the following switch statement? How many of these reach the default case? What happens if I append `fallthrough` at the end of case D? What happens if I move case B after case D? (Yes, I know it is possible to figure it out [my understanding of the answer to the first question is appended below], but I hope you&#39;ll agree with me that this is much more difficult to decipher than any switch statement that&#39;s currently possible.)</div><div><br></div><div>```</div><div>switch x /* or y, or z */ {</div><div>case A:</div><div>  // ...</div><div>  continue</div><div>case B:</div><div>  // ...</div><div>  if C ~= x /* or y, or z, whichever is switched over */ {</div><div>    continue</div><div>  }</div><div>  fallthrough</div><div>case C:</div><div>  // ...</div><div>  if B ~= x /* or y, or z, whichever is switched over */ {</div><div>    continue</div><div>  }</div><div>case D:</div><div>  // ...</div><div>default:</div><div>  // ...</div><div>}</div><div>```</div><div><br></div><div>[For switch x: statements in cases A and C only, not the default; for switch y: statements in case B, C and D, not the default; for switch z: statements in cases B and C, and in the default]<br></div><div><br></div><div><div>Finally, a really neat thing about `continue` in Swift is the ability to use labels; would you propose allowing that here? If so, could I label individual cases and have pattern matching resume at that case? How about resuming at a previous case? It&#39;d be neat. It&#39;d also make it possible to make an infinite loop out of a switch statement...</div><div><br></div></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class=""><font color="#888888">
-- E<br>
<br>
</font></span></blockquote></div><br></div></div>