> On Jan 4, 2018, at 11:53 AM, Xiaodi Wu <xiaodi...@gmail.com> wrote: > > > On Thu, Jan 4, 2018 at 13:46 Cheyo Jimenez <ch...@masters3d.com > <mailto:ch...@masters3d.com>> wrote: > > > On Jan 4, 2018, at 10:49 AM, Jordan Rose <jordan_r...@apple.com > <mailto:jordan_r...@apple.com>> wrote: > >> I'll admit I hadn't thought of using "unknown default" (or "default >> unknown"). I don't think that's terrible, but I mildly prefer `unknown case` >> because it builds on the "pun" that enum elements are also defined using >> 'case'. If anything hits this part of the switch, it really will be an >> "unknown case", i.e. a statically-unknown enum element. >> >> To Cheyo's point, if this were to be a single token I'd probably spell it >> #unknown, like #available. Then we'd have `case #unknown:` and something >> that naturally expands to other pattern positions. I found that less >> aesthetically pleasing, though, and so a context-sensitive keyword seemed >> like the way to go. >> >> (For the record, though, I wouldn't describe `case _` as a special case of >> `default`. They do exactly the same thing, and `_` is a useful pattern in >> other contexts, so if anything the current `default` should be thought of as >> syntactic sugar for `case _`.) > > Can case _ be mixed with unknown case? How can we match all compile time > known cases but exclude future cases? > > What’s your use case for that? That eliminates the possibility of “unknown > case” giving you compile-time warnings for subsequently added cases, which > was the entire purpose of adding the syntax in the first place.
I was thinking of a generalized `unknown case` pattern but that is out of scope for this proposal. <https://github.com/apple/swift-evolution/pull/777/files#diff-a68dc745ee86d09566b232b6954c5158R321> switch excuse { case .eatenByPet : //… unknown case: // … case _: // … } > > Should there be something like `case *` that would capture all currently > known cases during compile time? case * and case _ would be the same in > exhaustive enums. This is why I was suggesting another pattern that only captures known cases at compile time: switch excuse { case .eatenByPet : //… case * : // All cases captured at compile time. // … unknown case: // … } > > >> >> I'll add these points to the "Alternatives Considered" section in the PR >> later today. >> >> Jordan >> >> >>> On Jan 3, 2018, at 22:56, Xiaodi Wu <xiaodi...@gmail.com >>> <mailto:xiaodi...@gmail.com>> wrote: >>> >>> As has already been said, “case unknown” is source-breaking because it >>> conflicts with any real cases named “unknown”; “\unknown” looks like a key >>> path but isn’t, and I wonder if it would potentially conflict with existing >>> key paths. >>> >>> In any case, my point was not to bikeshed the “unknown” part, but to ask >>> whether any consideration had been made to have the feature presented as a >>> flavor of default instead of a flavor of case. >>> >>> On Wed, Jan 3, 2018 at 23:57 Cheyo Jimenez <ch...@masters3d.com >>> <mailto:ch...@masters3d.com>> wrote: >>> >>> >>> On Jan 3, 2018, at 6:52 PM, Xiaodi Wu via swift-evolution >>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote: >>> >>>> This is a very nice revision. One bikeshedding thought: >>>> >>>> Since "unknown case" is presented as a special kind of "default", can't be >>>> mixed with "default", and can't be used in case patterns, why not "default >>>> unknown" (or "unknown default") instead of "unknown case"? >>> >>> `case _ :` is already a special case of default. >>> I’d rather have `case unknown :` >>> `unknown case :` is weird because of the order of `case`. >>> >>> Another alternative is `case \unknown :` >>> `\unknown` would also allow pattern matching. >>> >>> >>> >>>> >>>> >>>> On Wed, Jan 3, 2018 at 8:05 PM, Jordan Rose via swift-evolution >>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote: >>>>> On Jan 2, 2018, at 18:07, Jordan Rose <jordan_r...@apple.com >>>>> <mailto:jordan_r...@apple.com>> wrote: >>>>> >>>>> [Proposal: >>>>> https://github.com/apple/swift-evolution/blob/master/proposals/0192-non-exhaustive-enums.md >>>>> >>>>> <https://github.com/apple/swift-evolution/blob/master/proposals/0192-non-exhaustive-enums.md>] >>>>> >>>>> Whew! Thanks for your feedback, everyone. On the lighter side of >>>>> feedback—naming things—it seems that most people seem to like '@frozen', >>>>> and that does in fact have the connotations we want it to have. I like it >>>>> too. >>>>> >>>>> More seriously, this discussion has convinced me that it's worth >>>>> including what the proposal discusses as a 'future' case. The key point >>>>> that swayed me is that this can produce a warning when the switch is >>>>> missing a case rather than an error, which both provides the necessary >>>>> compiler feedback to update your code and allows your dependencies to >>>>> continue compiling when you update to a newer SDK. I know people on both >>>>> sides won't be 100% satisfied with this, but does it seem like a >>>>> reasonable compromise? >>>>> >>>>> The next question is how to spell it. I'm leaning towards `unexpected >>>>> case:`, which (a) is backwards-compatible, and (b) also handles "private >>>>> cases", either the fake kind that you can do in C (as described in the >>>>> proposal), or some real feature we might add to Swift some day. `unknown >>>>> case:` isn't bad either. >>>>> >>>>> I too would like to just do `unknown:` or `unexpected:` but that's >>>>> technically a source-breaking change: >>>>> >>>>> switch foo { >>>>> case bar: >>>>> unknown: >>>>> while baz() { >>>>> while garply() { >>>>> if quux() { >>>>> break unknown >>>>> } >>>>> } >>>>> } >>>>> } >>>>> >>>>> Another downside of the `unexpected case:` spelling is that it doesn't >>>>> work as part of a larger pattern. I don't have a good answer for that >>>>> one, but perhaps it's acceptable for now. >>>>> >>>>> I'll write up a revision of the proposal soon and make sure the core team >>>>> gets my recommendation when they discuss the results of the review. >>>>> >>>>> --- >>>>> >>>>> I'll respond to a few of the more intricate discussions tomorrow, >>>>> including the syntax of putting a new declaration inside the enum rather >>>>> than outside. Thank you again, everyone, and happy new year! >>>> >>>> I ended up doing these in the opposite order, writing up the new proposal >>>> first and not yet responding to the discussion that's further out. You can >>>> read my revisions at https://github.com/apple/swift-evolution/pull/777 >>>> <https://github.com/apple/swift-evolution/pull/777>. >>>> >>>> In particular, I want to at least address: >>>> - Dave D and Drew C's points about versioned libraries / linking semantics >>>> of modules. >>>> - Jason M's point about migration >>>> and I'll do one more pass over the thread to see if there's anything else >>>> I didn't address directly. (That doesn't mean everyone who disagrees, just >>>> messages where I think there's more I can do to explain why the proposal >>>> is the way it is.) >>>> >>>> Jordan >>>> >>>> P.S. Enjoying the Disney references. Thanks, Nevin and Dave. :-) >>>> >>>> _______________________________________________ >>>> swift-evolution mailing list >>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org> >>>> https://lists.swift.org/mailman/listinfo/swift-evolution >>>> <https://lists.swift.org/mailman/listinfo/swift-evolution> >>>> >>>> >>>> _______________________________________________ >>>> swift-evolution mailing list >>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org> >>>> https://lists.swift.org/mailman/listinfo/swift-evolution >>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution