> On Jan 4, 2018, at 4:37 PM, Xiaodi Wu <xiaodi...@gmail.com> wrote:
> 
> 
> On Thu, Jan 4, 2018 at 19:29 Cheyo J. Jimenez <ch...@masters3d.com> wrote:
>>> On Jan 4, 2018, at 3:50 PM, Xiaodi Wu <xiaodi...@gmail.com> wrote:
>>> 
>>> 
>>> On Thu, Jan 4, 2018 at 18:39 Cheyo J. Jimenez <ch...@masters3d.com> wrote:
>>>> 
>>>>> On Jan 4, 2018, at 2:55 PM, Xiaodi Wu <xiaodi...@gmail.com> wrote:
>>>>> 
>>>>> 
>>>>> On Thu, Jan 4, 2018 at 17:15 Cheyo J. Jimenez <ch...@masters3d.com> wrote:
>>>>>>> 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> wrote:
>>>>>>>> 
>>>>>>>> 
>>>>>>>>> On Jan 4, 2018, at 10:49 AM, Jordan Rose <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. 
>>>>>> 
>>>>>> 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:
>>>>>>    // …
>>>>>>  }
>>>>> 
>>>>> Sorry, I don’t understand. However you spell it, what is your use case 
>>>>> for this? The stated purpose of “unknown case” is to gain compile-time 
>>>>> exhaustiveness testing, but this would not allow for that.
>>>> 
>>>> 
>>>> 
>>>> 
>>>> switch (excuse, notifiedTeacherBeforeDeadline) {
>>>> case (.eatenByPet, true):
>>>>   // …
>>>> case (.thoughtItWasDueNextWeek, true):
>>>>   // …
>>>> case (unknown case, true):
>>>>   // …
>>>> case (_, false):
>>>>   // …
>>>> }
>>>> 
>>>> Im referring to the future direction section in the new PR. The above 
>>>> example if from there. 
>>>> 
>>>> I am fine with `unknown case` being required to be at the end of the 
>>>> switch for now. 
>>>> 
>>>> I think of `unknown case` as a pattern that only matches unknown cases no 
>>>> matter where on the switch it is.
>>>> 
>>>> This is why I do not think that `default unknown` would work well once 
>>>> `unknown case` can be used a pattern.
>>>> 
>>>> We can start a new thread on this if you’d like. 
>>> 
>>> The reason I put forward “default unknown” is precisely because the 
>>> proposed feature *cannot* be used in a pattern and therefore seems more apt 
>>> as not a case.
>>> 
>> 
>> It can not be used in a pattern now but you could in the future if left as 
>> `case`. 
>> 
>> 
>>> It actually makes it more natural to use in the given example above because 
>>> “default unknown” could actually be used to provide compile-time 
>>> exhaustiveness checking for such a tuple pattern, whereas without being 
>>> able to use “unknown case” in a pattern you can’t write “case (unknown 
>>> case, _)”.
>> 
>> The way `unknown case` enforces  compile-time exhaustiveness is by only 
>> matching unknown cases. The implementation may be more close to default by 
>> the virtue of being forced to go at the end of the switch statement now but 
>> that should not dictate the user experience. 
> 
> We seem to agree that, by virtue of not supporting use in a pattern and being 
> placed at the end, the feature is a flavor of default. I’m still not sure I 
> understand why you believe it should not be a flavor of default going forward.
> 
>>> 
>>> You still haven’t answered my question, though—what’s the use case for the 
>>> feature you propose?
>> 
>> My use case would be distinguishing between compile time known cases vs 
>> “future only” cases (or unknown cases).
> 
> I understand that the feature you propose would allow you to make such a 
> distinction, but again, what is your use case for doing so?

Breaking out early by checking unknown cases first. I admit this is not deal 
breaker, just a different style I’d like to see supported in the future. 
> 
>> This depends on generalized `unknown case` patterns which is out of scope. I 
>> am happy to talk more about this on a different thread when this proposal 
>> gets approved. 
>> 
>> 
>> 
>>> 
>>>> 
>>>>  
>>>> 
>>>>> 
>>>>> 
>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 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> 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> 
>>>>>>>>>>> wrote:
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>>> On Jan 3, 2018, at 6:52 PM, Xiaodi Wu via swift-evolution 
>>>>>>>>>>>> <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> wrote:
>>>>>>>>>>>>>> On Jan 2, 2018, at 18:07, Jordan Rose <jordan_r...@apple.com> 
>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> [Proposal: 
>>>>>>>>>>>>>> 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.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> 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
>>>>>>>>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>>>> _______________________________________________
>>>>>>>>>>>> swift-evolution mailing list
>>>>>>>>>>>> swift-evolution@swift.org
>>>>>>>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>> 
>> 
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to