Oh, I see… the case would silently change from unexpected to default if they were both included. Hmm. I will have to think on this more.
Thanks, Jon > On Jan 5, 2018, at 3:17 PM, Jordan Rose <jordan_r...@apple.com> wrote: > > > >> On Jan 5, 2018, at 00:11, Jonathan Hull via swift-evolution >> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote: >> >>> >>> On Jan 4, 2018, at 11:02 PM, Xiaodi Wu <xiaodi...@gmail.com >>> <mailto:xiaodi...@gmail.com>> wrote: >>> >>> >>> On Fri, Jan 5, 2018 at 01:56 Jonathan Hull <jh...@gbis.com >>> <mailto:jh...@gbis.com>> wrote: >>>> On Jan 4, 2018, at 10:31 PM, Xiaodi Wu via swift-evolution >>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote: >>> >>>> >>>> On Fri, Jan 5, 2018 at 00:21 Cheyo Jimenez <ch...@masters3d.com >>>> <mailto:ch...@masters3d.com>> wrote: >>> >>>> >>>> On Jan 4, 2018, at 4:37 PM, Xiaodi Wu <xiaodi...@gmail.com >>>> <mailto:xiaodi...@gmail.com>> wrote: >>>> >>> >>>>> On Thu, Jan 4, 2018 at 19:29 Cheyo J. Jimenez <ch...@masters3d.com >>>>> <mailto:ch...@masters3d.com>> wrote: >>>>> >>>>> 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. >>> >>>> >>>> I'm still not sure I understand. How can the machine know that it's >>>> dealing with an unknown case without first checking if it matches any >>>> known case? >>> >>> >>> I had the same thought as Cheyo. It isn’t a deal breaker… I like the >>> compromise, but I would prefer it trigger only on an actual unknown case >>> (as opposed to acting like default). I like to break failure cases out at >>> the top when possible. I don’t see any good reason not to support that >>> style. >>> >>> To answer your question, in the naive sense, it basically is the same >>> question as asking if it is a known case (and then taking the inverse). >>> That doesn’t mean actually checking each case separately though. For >>> example, if the enum cases are internally represented as an unsigned >>> integer, and they are all together in a block, the compiler could simply >>> check that it is greater than the max known value. You could probably even >>> do a bit mask comparison in some cases... >>> >>> These are obvious optimizations, but why does this require new syntax? >> >> I am not sure I understand what you are asking. There isn’t additional >> syntax. We are just arguing over the name + behavior of ‘unexpected:’. You >> want it to behave like ‘default’ and I am saying that stops the use case I >> mention above. >> >> >>> What do you gain from writing the unknown case first? >> I know where to look for the failure cases. I also tend put a bunch of >> guard statements near the beginning of a function. It is just a programming >> style. >> >> With my behavior of ‘unexpected:’ you can put it wherever you want. Why >> limit that by forcing it to go at the end? >> >>> Isn't this basically the same thing as asking for the ability to write the >>> default case first, a frequently suggested and rejected syntax addition? >> >> No. I don’t think I have ever heard that asked for, but putting default in >> a different place has a different meaning. The way I read a switch >> statement anyway is that it tries each case until it find one that matches. >> Default matches everything, so it has to go at the end (since it will always >> match and nothing afterwards will be tried). >> >> Having ‘unexpected:’ also match known/expected cases is problematic as a >> mental model. I think that is just an artifact of the original proposal >> using default. There is no reason 'unexpected:’ should have to handle known >> cases as well… let’s just have it trigger on unexpected ones. > > I'm going to repeat this from my reply to Cheyo earlier: I really, really > don't want recompiling code against a different version of the library to > pick a different case than it did before. > > (This might be a weak argument since overload resolution, protocol > conformance checking, etc can end up picking a different declaration than it > did before. But I would hope that the overloads or alternate protocol > witnesses at least "do the same thing" in normal situations, if possibly more > efficiently. I wouldn't expect that for `unknown case` vs. `default` if you > actually had both of them.) > > > The reason `unknown case` has to match known cases is, again, for source > compatibility. If the compiler only produces a warning, rather than an error, > when you're missing a case, it has to do something if that case comes up. The > most reasonable thing for it to do (in the absence of a separate `default`) > is for that to go to the `unknown case`, just like it would have with the > last version of the app. That's why I chose to associate it with `default` in > the proposal, not the other way around. > > Jordan
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution