> On Sep 17, 2017, at 5:04 PM, BJ Homer <bjho...@gmail.com> wrote: > > 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.
• What is your evaluation of the proposal? Uh, +1 • How much effort did you put into your review? A glance, a quick reading, or an in-depth study? not enough Apologies for wasting everyone’s time... > -BJ > > On Sep 17, 2017, at 3:20 PM, Christopher Kornher via swift-evolution > <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote: > >> >>> On Sep 17, 2017, at 6:33 AM, Rod Brown via swift-evolution >>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote: >>> >>> >>>> On 17 Sep 2017, at 4:35 am, Christopher Kornher <ckorn...@me.com >>>> <mailto:ckorn...@me.com>> wrote: >>>> >>>>> On Sep 16, 2017, at 11:28 AM, Christopher Kornher via swift-evolution >>>>> <swift-evolution@swift.org <mailto: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 <mailto: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 <mailto: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 >>>>>>>>> >>>>>>>>> <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 <mailto: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 >>>>>>>>>>> <mailto: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 <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 <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 <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 <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