Thanks for the feedback, Dave! Responses inline.

> On Dec 20, 2017, at 09:23, Dave DeLong via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> 
> 
>> On Dec 19, 2017, at 3:58 PM, Ted Kremenek via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>> 
>> The review of "SE 0192 - Non-Exhaustive Enums" begins now and runs through 
>> January 3, 2018.
>> 
>> The proposal is available here:
>> 
>> 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>
>> When reviewing a proposal, here are some questions to consider:
>> 
>> What is your evaluation of the proposal?
>> 
> A very strong -1. I do not believe this is the appropriate solution to the 
> problem.
> 
> • While the goal of the proposal is to ensure the correctness of *client* 
> code, it does nothing to enforce the correctness of evolving *library* code. 
> As a library author, I can declare a public enum as “exhaustive”, yet still 
> add a new case in the next release. Nothing in the proposal prevents me from 
> doing this, yet doing so would obviously break any clients of my library. 

There are some ideas listed to prevent this occurence in the proposal. 
Additionally, such a change may be desirable for a major version release of a 
library distributed as source. Nothing prevents someone from changing the type 
of an 'open' method either, but that can also be a breaking change.


> • The name “exhaustive” is misleading for uninformed library authors. An 
> author creates an enum and then thinks “is that all of the cases? Yep! OK, 
> it’s @exhaustive”. Then the next evolution of the library occurs, new cases 
> arise, and now the enum isn’t exhaustive to handle the new cases. So a case 
> gets added, and the formerly-but-not-actually-exhaustive enum is re-stamped 
> as exhaustive, because it once again handles all known cases. “Exhaustive” is 
> not a strong enough name. It does not contain the idea of eternal permanence. 
> Once an enum gets branded as exhaustive and shipped as such, *it can never 
> change*. “Exhaustive” does not imply that, and the lack of that implication 
> will confuse library authors.

I don't think anyone loves the current name, but we haven't come up with a 
better one (cf. "Alternatives considered"). Any suggestions?

(As mentioned above, I also don't think this is an impossible situation either. 
But we'd certainly want people to not do it by accident.)



> • This proposal does not address the case of “publicly exhaustive enums with 
> private cases”. Consider NSExpression.ExpressionType: when creating 
> NSPredicates from format strings, it is easy to create sub-expressions whose 
> expression types are not one of the publicly listed cases. Based on the 
> proposal, NSExpression.ExpressionType would be correctly imported as a 
> non-exhaustive enum. HOWEVER. There is nothing *stopping* a library author 
> from declaring a publicly exhaustive enum (like NSExpression.ExpressionType), 
> but having private cases that get leaked (accidentally or not) past the 
> public barrier and end up in client code. This proposal does nothing to 
> prevent that.

Swift does not currently support enums with private cases (as mentioned in the 
proposal), but if it did, such an enum could not be marked "exhaustive". On the 
C side, there's no way to check that no one's secretly using a private case, so 
we have to trust the author of the type to use the equivalent annotation 
responsibly.


> The summary of these objections is this: you fundamentally cannot trust 
> libraries that are not bundled with your application to not change in 
> unexpected ways. Or in other words, if you don’t have the source code, you 
> cannot trust it. And even if you do have the source code, it’s still 
> questionable once you start bridging things in from other languages where 
> this sort of safety is not enforced.

This is fair, and we should consider leaving an implicit "default: 
fatalError()" in even for supposedly exhaustive enums (at least those imported 
from C).

Jordan


> 
> To summarize the summary: Leaving a judgement of “exhaustive or not” up to 
> fallible library authors isn’t safe.
> 
> To summarize the summary of the summary: people are a problem.
>> Is the problem being addressed significant enough to warrant a change to 
>> Swift?
>> 
> Yes, the problem is significant, but in my opinion this is the wrong answer.
>> Does this proposal fit well with the feel and direction of Swift?
>> 
> No. Implementing this proposal would give the appearance of safety while 
> still leaving developers subtly but dangerously vulnerable to imperfectly 
> written libraries (ie, all of them).
>> How much effort did you put into your review? A glance, a quick reading, or 
>> an in-depth study?
>> 
> I’ve been following the email threads, and I’ve spent years as a library 
> author, both on Apple frameworks and my own personal libraries.
> 
> 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

Reply via email to