> On Jun 6, 2016, at 12:37 PM, L Mihalkovic <[email protected]> 
> wrote:
> 
>> 
>> On Jun 6, 2016, at 6:51 PM, Douglas Gregor <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>>> 
>>> On Jun 5, 2016, at 3:24 AM, L. Mihalkovic via swift-evolution 
>>> <[email protected] <mailto:[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:
> 
> I was under the impression that extension defined conformance would fit 
> neither NormalProtocolConformance (nominal) nor 
> SpecializedProtocolConformance (generic) and that a 
> StrawmanExtensionProtocolConformance would then be required.

Well, that’s an implementation detail of the AST itself. We’d probably be able 
to leverage NormalProtocolConformance for this.

> 
>> 
>>      3) Into the list of protocol extensions of other protocols Q that 
>> provide conformance to P
>> 
>> 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).
> 
> because of the potential for contradictory definitions or redefinitions, I 
> was under the impression that it might be useful to define some sort of 
> prioritization for deciding which should be applied first. But that’s 
> probably because I don’t understand the topic as much as you do. That is also 
> why I was thinking that aside from priority, the structures might also have 
> to be tagged with something to tell where they come from (maybe priority is 
> just how these scope source are read). I guess this is also a requirement 
> that would stem from supporting private/local conformance.

Yes, if we admit multiple conformances of the same type X to a protocol P, we 
need some way to resolve the ambiguity *at runtime*. That has a cost, which 
could be significant depending on the chosen scheme. Personally, I don’t think 
we ever want to admit multiple/private/local conformances.

        - Doug

> 
>>      - Doug
>> 
>> 
>>> 
>>> On Jun 5, 2016, at 9:49 AM, Thorsten Seitz via swift-evolution 
>>> <[email protected] <mailto:[email protected]>> wrote:
>>> 
>>>> 
>>>>> Am 04.06.2016 um 23:18 schrieb Austin Zheng via swift-evolution 
>>>>> <[email protected] <mailto:[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-
>>>>>  
>>>>> <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
>>>>>  
>>>>> <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] <mailto:[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] <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

Reply via email to