Please note that, as proposed, enums are always treated as exhaustive *within 
the same module*. A new user writing MyFirstEnum is likely using it within the 
same module, and will thus get exhaustive behavior with no extra keywords 
required.

-BJ

> On Sep 17, 2017, at 3:20 PM, Christopher Kornher via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> 
>>> On Sep 17, 2017, at 6:33 AM, Rod Brown via swift-evolution 
>>> <swift-evolution@swift.org> wrote:
>>> 
>>> 
>>>> On 17 Sep 2017, at 4:35 am, Christopher Kornher <ckorn...@me.com> wrote:
>>>> 
>>>> On Sep 16, 2017, at 11:28 AM, Christopher Kornher via swift-evolution 
>>>> <swift-evolution@swift.org> wrote:
>>>> 
>>>> If a library writer can’t remember to declare non-exhaustive enums as 
>>>> such, they probably will forget many more important aspects of creating a 
>>>> library. They probably should not be writing libraries. Arguments like 
>>>> this make sense on the surface, but creating libraries involves hundreds 
>>>> or thousands of decisions. I wish you luck in making that process idiot 
>>>> proof. A library linter could easily warn that exposed enums are 
>>>> exhaustive. The exhaustive keyword should be optional to make the decision 
>>>> obvious and suppress warnings. Complicating the user experience in a vain 
>>>> attempt to make “expert" coding safer is misguided.
>> 
>> I think the same logic goes both ways: If a library author can’t remember to 
>> declare exhaustive enums as such, they will probably forget many more 
>> important aspects of creating a library.
>> 
>> The problem here is fundamental: Exhaustive is a guarantee. A guarantee 
>> should require action. Non-Exhaustive guarantees nothing. It makes you 
>> safer. That is all.
> 
> 1) Exhaustive enums are inherently better: they allow a developer to know 
> that they have covered all possible cases by not using a default.
> 2) This proposal forces developers to add a keyword to get this behavior in 
> their apps, which is common to all other languages with enums that I have 
> used. This proposal breaks the model common to all (?) current 
> implementations of enums. 
> 
> 
>> 
>>> 
>>> This may be a little harsh, but there don’t seem to be many advocates for 
>>> novice and “ordinary” application developers on this list. That is not 
>>> unexpected given the number of extremely knowledgeable compiler and library 
>>> developers on this list (for whom I have the highest respect). I believe 
>>> that there are more creative (and probably more difficult to build) 
>>> possible solutions to some of the tough problems in Swift’s future. In that 
>>> spirit, see below.
>> 
>> I personally am an “ordinary” application developer.
>> 
>> I think the issue here is that everyone is seeing Swift as *they* intend to 
>> use it. For App Devs, exhaustive switches are nice, which means they really 
>> are fighting tooth and nail to keep them. I understand that. But I’m also 
>> trying to keep my mind open for “what happens to an app I compiled in iOS 15 
>> that I compiled for iOS 11?” And this gives me pause. I can’t ask Apple or 
>> any other library author to be completely knowledgable about every case in 
>> the future, and to audit every line of code and manually give non-exhaustive.
>> 
>> Why do people want “exhaustive” to be the default?
>> Because we like things as they are.
> 
> No, because it makes sense to make common things easy and uncommon things 
> possible. 
> 
>> Because we like not having to consider edge cases. Because we want to 
>> imagine that will give framework developers the control to make our lives 
>> difficult because they’ll just be lazy and make our lives hard by not 
>> annotating. And this certainly is a concern. But I think a larger concern is 
>> breaking apps left, right and centre, or not being able to extend frameworks 
>> because an earlier developer on a project made an oversight.
> 
> This happens all the time: Apple deprecates APIs and asked developers to use 
> new ones. If a library writer does not run (the as-yet hypothetical ) library 
> lint, not participate in thorough code reviews,…, they can simply create a 
> new non-exhaustive enum and deprecate the old one. Yes, there will be some 
> redundant function calls for a while, but again, similar things happen, even 
> in APIs like Apple’s, that (one hopes, at least) are thoroughly reviewed. It 
> is not the end of the world to deprecate and migrate APIs. You  may remember 
> garbage collected Objective-C, the change that “viewWillAppear” suddenly was 
> not called when it used to be in iOS. We all survived the elimination of GC 
> and moving our view initialization code. Libraries and developers can survive 
> mistakes and improvements.
> 
> ABI stability does not require foolproof, immutable, ABIs. In essence, it is 
> just a guarantee that the build system won’t require rebuilds if library 
> source code stays the same, or is added to, not that applications will never 
> have to be rebuilt in the real world where breaking changes are often 
> required. Adding ABI stability when enums change (in limited ways, don’t 
> forget, removing a case is a breaking change) is a good addition, but it does 
> not rise to the level of requiring degradation of the experience for 
> beginners, IMO.
> 
> 
>> Its in everyone’s best interest to think before we put handcuffs on, no 
>> matter how painful that is. Even if that means you make apps where you just 
>> write “default: fatalError(“I don’t handle unreachable defaults”)"
>> 
>> And lets be clear: Swift isn’t an app development language. It also isn’t a 
>> framework development language. It’s a multipurpose language designed to 
>> Take Over The World™. This means we need to think holistically about what is 
>> better for everyone. Not just ourselves.
> 
> That includes being easy to learn and understand. Enums are exhaustive in 
> other languages and should be exhaustive by default in Swift. No extra 
> keywords should be required to create “MyFirstEnum” that behaves in a 
> sensible way. The documentation that describes why you need to write a 
> ‘default’ clause or 'exhaustive' when you have all the possible cases written 
> down should be interesting. May I suggest: “You see, if you write a library 
> (don’t worry about what that means right now) you don’t have to worry about 
> being not very good at it. If and when you write one, it will be a tiny bit 
> easier, so write this meaningless clause or the magical keyword — your 
> choice.” 
> 
>> 
>>> 
>>>> 
>>>> 
>>>>> 
>>>>> If you declare it is exhaustive and it was an oversight, and then realise 
>>>>> after the fact that you are wrong, you have to open it up. This will 
>>>>> break third party apps. It will be disallowed by the ABI compatibility 
>>>>> requirements.
>>>>> 
>>>>> If you declare it isn’t exhaustive due to an oversight (or perhaps you’re 
>>>>> just not sure yet), and then realise after the fact it is exhaustive, you 
>>>>> can close it up. This will not break third party apps. It will also be 
>>>>> allowed for ABI compatibility.
>>>>> 
>>>>> This benefits everyone. Make library owners choose a guarantee, rather 
>>>>> than be defaulted into it. Much like they have to declare choose to 
>>>>> declare “final” on a class: you can’t retroactively reneg that promise: 
>>>>> it will break everyone who assumed it to be the case!
>>>> 
>>>> It does not benefit the creation of 90+% of enums. It is one more arcane 
>>>> rule for the vast majority of developers.
>>> 
>>> The Swift compiler could offer a “strict enum exhaustiveness” (bikeshedding 
>>> not included) switch that could be enabled by default for library targets 
>>> and disabled by default for “application” targets. The switch would make 
>>> not explicitly specifying exhaustiveness an error or warning when enabled. 
>>> Perhaps this could be combined with other options that would tailor the 
>>> development experience for library/application developers. This would help 
>>> avoid “zero-sum” choices between benefitting library or application 
>>> developers in the future.
>> 
>> The Swift team have fundamentally opposed such pushes for “compiler modes” 
>> for a long time. I don’t expect they will embrace them now, nor do I think 
>> they should just to avoid us devs having to write the occasional “default” 
>> clause. This is, to be clear, a relatively rare case.
> 
> It is probably a good choice, but there are potential upsides. Oh, course, 
> this could easily lead to a library dialect and an application dialect of 
> Swift. That is already the de-facto state of affairs for many languages, 
> including Swift. Would formalizing the difference make of “taking over the 
> world” more attainable or just create a mess?  A "library switch" could be 
> horribly abused, and should only be used as a last resort. Ideally, it would 
> only generate warnings in library mode. 
> 
> 
>> 
>>> 
>>> Xcode and the SPM should be able to distinguish between the target types 
>>> and generate the proper defaults. I do not believe that this is too 
>>> mysterious for developers. There would be learning step for developers 
>>> wiring their first library, but that is not necessarily a bad thing since 
>>> creating a reusable library requires a different mindset than creating an 
>>> application.
>>> 
>>> 
>>>> 
>>>>> 
>>>>>> 
>>>>>> Exhaustive and open by default with keywords to close things down if the 
>>>>>> framework author wants them.
>>>>>> 
>>>>>> Sent from my iPhone
>>>>>> 
>>>>>>> On 16 Sep 2017, at 09:55, David Hart via swift-evolution 
>>>>>>> <swift-evolution@swift.org> wrote:
>>>>>>> 
>>>>>>> I’m still very much bothered by having 2 new keywords. I would really 
>>>>>>> prefer the following plan:
>>>>>>> 
>>>>>>> Exhaustive by default in Swift 4
>>>>>>> No new keyword in Swift 4 to change that behaviour
>>>>>>> Non-exhaustive by default outside the module in Swift 5
>>>>>>> exhaustive keyword to change the default behaviour
>>>>>>> 
>>>>>>> Like that, we don’t need nonexhaustive.
>>>>>>> 
>>>>>>> Thoughts?
>>>>>>> David.
>>>>>>> 
>>>>>>>> On 13 Sep 2017, at 21:16, Jordan Rose via swift-evolution 
>>>>>>>> <swift-evolution@swift.org> wrote:
>>>>>>>> 
>>>>>>>> Proposal updated, same URL: 
>>>>>>>> https://github.com/jrose-apple/swift-evolution/blob/non-exhaustive-enums/proposals/nnnn-non-exhaustive-enums.md.
>>>>>>>> 
>>>>>>>> Thanks again for all the feedback so far, everyone!
>>>>>>>> Jordan
>>>>>>>> 
>>>>>>>> 
>>>>>>>>> On Sep 12, 2017, at 17:55, Jordan Rose via swift-evolution 
>>>>>>>>> <swift-evolution@swift.org> wrote:
>>>>>>>>> 
>>>>>>>>> Sorry, I got distracted by other tasks! Both the discussion here and 
>>>>>>>>> within Apple has moved towards making "non-exhaustive" the default, 
>>>>>>>>> which, to be honest, I too think is the best design. I'll update the 
>>>>>>>>> proposal today to reflect that, though I still want to keep both the 
>>>>>>>>> "nonexhaustive" and "exhaustive" keywords for Swift 4 compatibility 
>>>>>>>>> for now (or whatever we end up naming them). The compatibility design 
>>>>>>>>> is a little less ambitious than Brent's; as currently proposed, Swift 
>>>>>>>>> 4 mode continues to default to 'exhaustive' all the time, even in the 
>>>>>>>>> actual Swift 5 release.
>>>>>>>>> 
>>>>>>>>> I still want to respond to Brent's points directly, but I think you 
>>>>>>>>> and Vladimir have done a good job discussing them already. I'll send 
>>>>>>>>> out the updated proposal tomorrow, after I have a little more time to 
>>>>>>>>> think about #invalid.
>>>>>>>>> 
>>>>>>>>> Thanks for putting time into this!
>>>>>>>>> Jordan
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>>> On Sep 9, 2017, at 17:34, Rod Brown <rodney.bro...@icloud.com> wrote:
>>>>>>>>>> 
>>>>>>>>>> Jordan,
>>>>>>>>>> 
>>>>>>>>>> Do you have any other thoughts about the ongoing discussion here, 
>>>>>>>>>> especially regarding Chris’ comments? As you’re the one pushing this 
>>>>>>>>>> forward, I’d really like to know what your thoughts are regarding 
>>>>>>>>>> this?
>>>>>>>>>> 
>>>>>>>>>> - Rod
>>>>>>>>> 
>>>>>>>>> _______________________________________________
>>>>>>>>> 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
>>>>>> _______________________________________________
>>>>>> 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
>> 
>> _______________________________________________
>> 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