Sent from my iPhone
> On 28 Sep 2016, at 17:51, Douglas Gregor via swift-evolution > <swift-evolution@swift.org> wrote: > > >> On Sep 27, 2016, at 5:06 PM, Jordan Rose <jordan_r...@apple.com> wrote: >> >> Great job thinking this all through (as usual), and I’ll be very happy to >> have Optional and Array become Equatable. Here’s some of my thoughts on the >> library evolution aspect of this: >> >> - Removing a conditional conformance isn’t allowed, obviously. >> - Adding a conditional conformance is just like adding an unconditional >> conformance—it needs availability info. > > Right. The main wrinkle I see here is that, when you add a conditional > conformance, you will effectively end up with overlapping conformances when > running an old application against a new library. Do you want me to capture > these cases in the proposal in a section on “Resilience” or “Library > Evolution”, like I’ve tried to capture the effect on ABI Stability? (I think > that makes sense) > >> - It would be nice™ if making a conditional conformance more general was >> allowed. Since the plan doesn't allow overlapping conformances, I think this >> is actually implementable: just don’t put the constraints in the symbol >> name. I don’t know how to represent the backwards-deploying aspects of this >> right now, so it probably makes sense to forbid it today, but I think it >> would be nice if the implementation left the door open. > > Yeah. It’s a different set of witness tables that one would need to gather to > use the conditional conformance in the newer version of the library vs. in an > older version of a library. That’s okay if we leave the > witness-table-gathering to the runtime, but not so great if we statically > provide the witness tables. > Would this be a case in which the win by having this feature and letting the runtime gather the witness tables offset the losses from doing his operations at runtime? I would like to think that in cases like this there is at least the option to opt for more flexibility. > >> On that note, what happens here? >> >> // Module Lib >> public protocol Base {} >> public protocol Sub: Base {} >> public protocol Special: Sub {} >> >> public struct Impl<T> {} >> extension Impl: Special where T: Special {} >> >> >> // Module Client >> import Lib >> >> extension Impl: Sub where T: Sub {} >> >> I think this gets rejected because Impl already has a conformance to Sub—the >> extension in Client, despite being less specialized, shows up too late to >> actually declare this conformance “better”. Is that correct? > > Correct. Impl has a conformance to ‘Sub’ in Lib; Client cannot declare a new > one, because it overlaps. Had all of this code been in one module, it would > be well-formed, because the implied conformance to ’Sub’ in the first > extension would lose to the explicit conformance to Sub in the second > (less-specialized) extension. > > - Doug > > > _______________________________________________ > 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