> On Sep 17, 2017, at 5:04 PM, BJ Homer <[email protected]> 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
> <[email protected] <mailto:[email protected]>> wrote:
>
>>
>>> On Sep 17, 2017, at 6:33 AM, Rod Brown via swift-evolution
>>> <[email protected] <mailto:[email protected]>> wrote:
>>>
>>>
>>>> On 17 Sep 2017, at 4:35 am, Christopher Kornher <[email protected]
>>>> <mailto:[email protected]>> wrote:
>>>>
>>>>> On Sep 16, 2017, at 11:28 AM, Christopher Kornher via swift-evolution
>>>>> <[email protected] <mailto:[email protected]>> 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
>>>>>>> <[email protected] <mailto:[email protected]>> 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
>>>>>>>>> <[email protected] <mailto:[email protected]>> 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
>>>>>>>>>> <[email protected] <mailto:[email protected]>> 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 <[email protected]
>>>>>>>>>>> <mailto:[email protected]>> 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
>>>>>>>>>> [email protected] <mailto:[email protected]>
>>>>>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>>>>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>>>>>>>
>>>>>>>>> _______________________________________________
>>>>>>>>> swift-evolution mailing list
>>>>>>>>> [email protected] <mailto:[email protected]>
>>>>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>>>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> swift-evolution mailing list
>>>>>>>> [email protected] <mailto:[email protected]>
>>>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>>>>> _______________________________________________
>>>>>>> swift-evolution mailing list
>>>>>>> [email protected] <mailto:[email protected]>
>>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>>>> _______________________________________________
>>>>>> swift-evolution mailing list
>>>>>> [email protected] <mailto:[email protected]>
>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>>>
>>>>> _______________________________________________
>>>>> swift-evolution mailing list
>>>>> [email protected] <mailto:[email protected]>
>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>> _______________________________________________
>>> swift-evolution mailing list
>>> [email protected] <mailto:[email protected]>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>
>> _______________________________________________
>> swift-evolution mailing list
>> [email protected] <mailto:[email protected]>
>> https://lists.swift.org/mailman/listinfo/swift-evolution
>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution