[swift-evolution] Proposal: Remove the "fallthrough" keyword

Dave Abrahams dabrahams at apple.com
Fri Jan 20 14:22:27 CST 2017


on Sat Dec 05 2015, jgroff at apple.com (Joe Groff) wrote:

>> On Dec 5, 2015, at 10:13 AM, David Owens II <david at owensd.io> wrote:
>> 
>> Is there a reason we cannot use labelled case statements?
>> 
>>     switch some_value {
>>     case .REFINED:
>>         if !validate(some_value) { return NULL }
>>         fallthrough base
>> 
>>     base: case .BASE:
>>         handle_enum_value();
>>     }
>> 
>> At least this is explicit now.
>
> Yeah, maybe there's a more general language feature that could replace 'fallthrough' here. Instead
> of labelling cases, we could support a 'reswitch' statement that redispatches the switch to the case
> matching the operand:
>
>     switch some_value {
>     case .REFINED:
>         if !validate(some_value) { return NULL }
>         reswitch .BASE
>
>     case .BASE:
>         handle_enum_value();
>     }

We should just call a spade a spade and spell that "goto" ;-)

> That should be easy to peephole to a proper fallthrough in constant cases, but would also nicely
> generalize to applications like interpreters, where it's often desirable to push the dispatch inline
> into the logic for better pipelining.
>
> -Joe
>
>> 
>>> On Dec 5, 2015, at 10:04 AM, Vinicius Vendramini <vinivendra at gmail.com <mailto:vinivendra at
> gmail.com>> wrote:
>>> 
>>> I understand there might be some cases in which the syntax provided
>>> is indeed useful for experienced programmers writing their
>>> code. However, in almost all the examples here, I had to struggle
>>> to understand the logic behind the code. Not because it’s poorly
>>> written... probably because this syntax may be used for many
>>> different purposes, so it’s hard to get what exactly is the intent
>>> behind each use.
>>> 
>>> In Pierre’s latest example, for instance, it took me a few seconds
>>> to understand what was going on. I know it’s a simplified case, but
>>> it seems clearer to me to just write something like
>>> 
>>> if some_value == .Refined && !validate(some_value) {
>>> 	return NULL
>>> }
>>> handle_enum_value()
>>> 
>>> More complex cases make for a better argument for `switch`es,
>>> mainly because they avoid big `if` pyramids, but especially in
>>> those I feel the resulting code is significantly harder to
>>> understand.
>>> 
>>>> On Dec 5, 2015, at 12:15 PM, Pierre Habouzit <phabouzit at apple.com <mailto:phabouzit at apple.com>> wrote:
>>>> 
>>>> 
>>>>> On Dec 5, 2015, at 9:02 AM, Chris Lattner <clattner at apple.com <mailto:clattner at apple.com>> wrote:
>>>>> 
>>>>> On Dec 4, 2015, at 2:05 PM, jalkut at red-sweater.com <mailto:jalkut at red-sweater.com> wrote:
>>>>>> 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?
>>>>> 
>>>>> 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.  To someone who doesn’t know them, the later are
>>>>> "syntactic magic” with no reasonable way to decipher other than
>>>>> looking them up somewhere.  The former is an English word whose
>>>>> meaning is obvious in context.
>>>>> 
>>>>> 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.
>>>> 
>>>> Given that Swift has the goal to also be a low level language, fallthrough is really useful for conciseness and readability.
>>>> 
>>>> in system programming C, I find myself writing things like this very often:
>>>> 
>>>> 
>>>> switch (some_value) {
>>>> case ENUM_VALUE_REFINED:
>>>>     if (validate(some_value)) {
>>>>         return NULL;
>>>>     }
>>>>     /* fallthrough */
>>>> case ENUM_VALUE_BASE:
>>>>     handle_enum_value();
>>>>>>>> }
>>>> 
>>>> Where the swift equivalent would roughly be:
>>>> 
>>>> switch some_value {
>>>> case .REFINED:
>>>>     if !validate(some_value) { return NULL }
>>>>     fallthrough
>>>> case .BASE:
>>>>     handle_enum_value();
>>>> }
>>>> 
>>>> This is as readable as it gets and is a pattern that the libdispatch has in several places e.g.
>>>> 
>>>> Of course, you cannot fall through to arbitrary cases, so things like this C code cannot be done in swift:
>>>> 
>>>> switch (some_value) {
>>>> case ENUM_VALUE_REFINED_1:
>>>>     if (validate(some_value)) {
>>>>         return NULL;
>>>>     }
>>>>     goto base_value;
>>>> case ENUM_VALUE_REFINED_2:
>>>>     if (validate(some_value)) {
>>>>         return NULL;
>>>>     }
>>>>     goto base_value;
>>>> 
>>>> case ENUM_VALUE_BASE:
>>>> base_value:
>>>>     handle_enum_value();
>>>>>>>> }
>>>> 
>>>> 
>>>> cannot be written in swift, despite also being quite useful.
>>>> 
>>>> 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.
>>>> 
>>>> -Pierre
>>>> 
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>> 
>>> _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution
> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>> 
>>  _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution
> <https://lists.swift.org/mailman/listinfo/swift-evolution>
> -------------- next part --------------
> An HTML attachment was scrubbed...
> URL:
> <https://lists.swift.org/pipermail/swift-evolution/attachments/20151205/193d117e/attachment.html>

-- 
-Dave



More information about the swift-evolution mailing list