<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><blockquote type="cite" class="">On Dec 5, 2015, at 9:02 AM, Chris Lattner &lt;<a href="mailto:clattner@apple.com" class="">clattner@apple.com</a>&gt; wrote:<br class=""><br class="">On Dec 4, 2015, at 2:05 PM, <a href="mailto:jalkut@red-sweater.com" class="">jalkut@red-sweater.com</a> wrote:<br class=""><blockquote type="cite" class="">In the spirit of some other proposals that remove C or C++ style artifacts, what do folks think about the possibility of removing the "fallthrough" keyword from the language?<br class=""></blockquote><br class="">I’m not making an argument either way, but I want to point something out: there is a major difference between fallthrough vs ++/c-style-for. &nbsp;To someone who doesn’t know them, the later are "syntactic magic” with no reasonable way to&nbsp;decipher other than looking them up somewhere. &nbsp;The former is an English word whose meaning is obvious in context.<br class=""><br class="">All I’m saying is that to a reader of code, the “badness” of ++ and c-style for loops is greater than the “badness" of fallthrough.<br class=""></blockquote><br class=""><div class="">Given that Swift has the goal to also be a low level language, fallthrough is really useful for conciseness and readability.</div><div class=""><br class=""></div><div class="">in system programming C, I find myself writing things like this very often:</div><div class=""><br class=""></div><div class=""><br class=""></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><font face="Menlo" class="">switch (some_value) {</font></blockquote><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><font face="Menlo" class="">case ENUM_VALUE_REFINED:</font></blockquote><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><font face="Menlo" class="">&nbsp; &nbsp; if (validate(some_value)) {</font></blockquote><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><font face="Menlo" class="">&nbsp; &nbsp; &nbsp; &nbsp; return NULL;</font></blockquote><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><font face="Menlo" class="">&nbsp; &nbsp; }</font></blockquote><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><font face="Menlo" class="">&nbsp; &nbsp; /* fallthrough */</font></blockquote><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><font face="Menlo" class="">case ENUM_VALUE_BASE:</font></blockquote><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><font face="Menlo" class="">&nbsp; &nbsp; handle_enum_value();</font></blockquote><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><font face="Menlo" class="">&nbsp; &nbsp;&nbsp;…</font></blockquote><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><font face="Menlo" class="">}</font></blockquote><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><br class=""></blockquote>Where the swift equivalent would roughly be:<br class=""><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class=""><br class=""></div><div class=""><font face="Menlo" class="">switch some_value {</font></div><div class=""><font face="Menlo" class="">case .REFINED:</font></div><div class=""><font face="Menlo" class="">&nbsp; &nbsp; if !validate(some_value) { return NULL }</font></div><div class=""><font face="Menlo" class="">&nbsp; &nbsp; fallthrough</font></div><div class=""><font face="Menlo" class="">case .BASE:</font></div><div class=""><font face="Menlo" class="">&nbsp; &nbsp; handle_enum_value();</font></div><div class=""><font face="Menlo" class="">}</font></div></blockquote><br class=""><div class="">This is as readable as it gets and is a pattern that the libdispatch has in several places e.g.</div><div class=""><br class=""></div><div class="">Of course, you cannot fall through to arbitrary cases, so things like this C code cannot be done in swift:</div><div class=""><br class=""></div><div class=""><blockquote style="margin: 0px 0px 0px 40px; border: none; padding: 0px;" class=""><font face="Menlo" class="">switch (some_value) {</font></blockquote><blockquote style="margin: 0px 0px 0px 40px; border: none; padding: 0px;" class=""><span style="font-family: Menlo;" class="">case ENUM_VALUE_REFINED_1:</span></blockquote><blockquote style="margin: 0px 0px 0px 40px; border: none; padding: 0px;" class=""><span style="font-family: Menlo;" class="">&nbsp; &nbsp; if (validate(some_value)) {</span></blockquote><blockquote style="margin: 0px 0px 0px 40px; border: none; padding: 0px;" class=""><font face="Menlo" class="">&nbsp; &nbsp; &nbsp; &nbsp; return NULL;</font></blockquote><blockquote style="margin: 0px 0px 0px 40px; border: none; padding: 0px;" class=""><font face="Menlo" class="">&nbsp;</font><span style="font-family: Menlo;" class="">&nbsp; &nbsp;}</span></blockquote><blockquote style="margin: 0px 0px 0px 40px; border: none; padding: 0px;" class=""><span style="font-family: Menlo;" class="">&nbsp; &nbsp; goto base_value;</span></blockquote><blockquote style="margin: 0px 0px 0px 40px; border: none; padding: 0px;" class=""><span style="font-family: Menlo;" class="">case ENUM_VALUE_REFINED_2:</span></blockquote><blockquote style="margin: 0px 0px 0px 40px; border: none; padding: 0px;" class=""><span style="font-family: Menlo;" class="">&nbsp; &nbsp; if (validate(some_value)) {</span></blockquote><blockquote style="margin: 0px 0px 0px 40px; border: none; padding: 0px;" class=""><font face="Menlo" class="">&nbsp; &nbsp; &nbsp; &nbsp; return NULL;</font></blockquote><blockquote style="margin: 0px 0px 0px 40px; border: none; padding: 0px;" class=""><font face="Menlo" class="">&nbsp;</font><span style="font-family: Menlo;" class="">&nbsp; &nbsp;}</span></blockquote><blockquote style="margin: 0px 0px 0px 40px; border: none; padding: 0px;" class=""><span style="font-family: Menlo;" class="">&nbsp; &nbsp; goto base_value;</span></blockquote><blockquote style="margin: 0px 0px 0px 40px; border: none; padding: 0px;" class=""><span style="font-family: Menlo;" class=""><br class=""></span></blockquote><blockquote style="margin: 0px 0px 0px 40px; border: none; padding: 0px;" class=""><span style="font-family: Menlo;" class="">case ENUM_VALUE_BASE:</span></blockquote><blockquote style="margin: 0px 0px 0px 40px; border: none; padding: 0px;" class=""><font face="Menlo" class="">base_value:</font></blockquote><blockquote style="margin: 0px 0px 0px 40px; border: none; padding: 0px;" class=""><font face="Menlo" class="">&nbsp; &nbsp; handle_enum_value();</font></blockquote><blockquote style="margin: 0px 0px 0px 40px; border: none; padding: 0px;" class=""><font face="Menlo" class="">&nbsp; &nbsp;&nbsp;…</font></blockquote><blockquote style="margin: 0px 0px 0px 40px; border: none; padding: 0px;" class=""><font face="Menlo" class="">}</font></blockquote></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><br class=""></div><div class="">cannot be written in swift, despite also being quite useful.</div><div class=""><br class=""></div><div class="">Jumping between arbitrary points inside a switch is disgusting. jumping from label to label is useful and not harmful especially in swift where you can’t place code between the “switch” and the first case.</div><div class=""><br class=""></div><div class="">-Pierre</div></body></html>