> Am 06.06.2016 um 18:51 schrieb Douglas Gregor <[email protected]>:
> 
> 
>> On Jun 5, 2016, at 3:24 AM, L. Mihalkovic via swift-evolution 
>> <[email protected]> wrote:
>> 
>> The issue is to decide on the applicability scope. Thinking 'my app/their 
>> stuff' is an illusion. To the compiler & runtime there is only code split 
>> into modules, some in source code and others as dylibs (.dll, .so, ...). Any 
>> extension based conditional refines a protocol everywhere. What's hard is to 
>> compute the complete effects of these changes predictably, reliably and 
>> fast. Because when we consider 'but look, i have a single small extension', 
>> the compiler&runtime must be ready to deal symetrically with anything we 
>> throw at it. They can't start building 15 different ways the compute the 
>> side effects based on many different scenarios because it will be un-ruly 
>> code, and too complex to try to explain to us what we will see.
>> The circular redefinitions case is one of the knightmares that hides in 
>> there... would mean having to assign priority to scopes, when there is no 
>> scopes yet. At the moment, the binary conformance table contains records for 
>> 3 types of conformances. First step would be to add a new type to match 
>> extension based conformance, and then record where it came from, and add 
>> some priority scheme to be able to navigate any conformance chain(remember 
>> that the pb grows everytime we decide 'oh cool, lets use a Padleft module 
>> rather than write my own 15 lines to do it - see the recent pb with nodejs). 
>> Not a simple task even with time, which they do not have now.
>> 
>> @core_team i know this is a coarse explanation, but hopefully at least in 
>> the right ballpark.
> 
> Roughly, yes. The specific problem regards answering the question “where must 
> the runtime look to determine whether a given type X conforms to protocol 
> P?”. Right now, the runtime conceptually needs to look:
> 
>       1) Into a list of known protocol conformances for the type X, and
>       2) If X is a class type, the list of known protocol conformances for 
> the superclass of X (recursively)
> 
> If we add the ability for a protocol extension to add a conformance to 
> another protocol, add to that:
> 
>       3) Into the list of protocol extensions of other protocols Q that 
> provide conformance to P

So, the difference is that in the case

protocol P { ... }
protocol Q : P { ... }
struct X : Q {...}

X's list of known protocol conformances already contains Q and P, 
whereas in the case

protocol P { ... }
protocol Q { ... }
struct X : Q {...}
extension Q : P

X's list of known protocol conformances just contains Q and is not extended by 
P as a result of the extension?
Did I understand this right? Is that (not being able to extend the conformance 
lists of all types as a result of an extension) a restriction of having module 
boundaries? Or is it simply not feasible for other reasons?

-Thorsten 


> 
> That’s a fairly significant expansion, and for each of the protocol 
> extensions in (3), we need to evaluate whether X conforms to the extended 
> protocol Q (and any additional constraints placed on that protocol extension).
> 
>       - Doug
> 
> 
>> 
>> On Jun 5, 2016, at 9:49 AM, Thorsten Seitz via swift-evolution 
>> <[email protected]> wrote:
>> 
>>> 
>>>> Am 04.06.2016 um 23:18 schrieb Austin Zheng via swift-evolution 
>>>> <[email protected]>:
>>>> 
>>>> Hello Dan,
>>>> 
>>>> You'll be pleased to learn that conforming generic types conditionally to 
>>>> protocols is on the roadmap (and is one of the highest priority items for 
>>>> the versions of Swift following 3.0): 
>>>> https://github.com/apple/swift/blob/master/docs/GenericsManifesto.md#conditional-conformances-
>>>> 
>>>> However, it's unlikely that protocols will gain conditional conformance: 
>>>> https://github.com/apple/swift/blob/master/docs/GenericsManifesto.md#conditional-conformances-via-protocol-extensions
>>> 
>>> "However, similar to private conformances, it puts a major burden on the 
>>> dynamic-casting runtime to chase down arbitrarily long and potentially 
>>> cyclic chains of conformances, which makes efficient implementation nearly 
>>> impossible.“
>>> 
>>> I’ve been wondering what the problem with the implementation is. I mean 
>>> instead of using an extension the same conformance could have been declared 
>>> beforehand, i.e. instead of
>>> 
>>> protocol P { func foo() }
>>> protocol Q { func bar() }
>>> extension Q : P { func foo() { bar() } }
>>> 
>>> we could have written the allowed
>>> 
>>> protocol P { func foo() }
>>> protocol Q : P { func foo() { bar() } }
>>> 
>>> with the exact same effect.
>>> 
>>> The only difference would be that the extension might have been in another 
>>> module than Q. 
>>> Is having to cross module boundaries causing the cited problems? Would the 
>>> same problems exist if in the second example Q would be defined in another 
>>> module?
>>> 
>>> -Thorsten
>>> 
>>> 
>>>> 
>>>> That document originates from a mailing list post made some time ago, and 
>>>> is a decent overview as to what sorts of type system features the Swift 
>>>> core developers are interested in building.
>>>> 
>>>> Best,
>>>> Austin
>>>> 
>>>>> On Jun 4, 2016, at 2:12 PM, Dan Zimmerman via swift-evolution 
>>>>> <[email protected]> wrote:
>>>>> 
>>>>> Hey,
>>>>> 
>>>>> I was interested in adopting the ability for a type that's generic in 
>>>>> some sense (either via generics or via associated types, in the case of 
>>>>> protocols) to conform to other protocols conditionally based on its type 
>>>>> parameter/associated type. For example:
>>>>> 
>>>>> ```
>>>>> extension CollectionType: Equatable where Generator.Element: Equatable {}
>>>>> 
>>>>> func ==<Collection: CollectionType where Collection.Generator.Element: 
>>>>> Equatable>(left: Collection, right: Collection) -> Bool {
>>>>>  return zip(left, right).reduce(true) { accumulator, tuple in accumulator 
>>>>> && (tuple.0 == tuple.1) }
>>>>> }
>>>>> ```
>>>>> 
>>>>> If this has already been proposed and knocked out/accepted please direct 
>>>>> me to the right place.
>>>>> _______________________________________________
>>>>> swift-evolution mailing list
>>>>> [email protected]
>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>> 
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> [email protected]
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>> 
>>> _______________________________________________
>>> swift-evolution mailing list
>>> [email protected]
>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>> _______________________________________________
>> swift-evolution mailing list
>> [email protected]
>> https://lists.swift.org/mailman/listinfo/swift-evolution
> 
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to