I offer a +1, but I have two criticisms of the proposal.
The first is that the example given in the proposal is stated a lot more
strongly than is true:
> func compareTwo(first: Comparable, _ second: Comparable) -> Int { // error!
> if first < second {
> return -1
> }
> //...
> }
> The code above yields an error, and rightfully so, because if the real types
> of first and second are not equal, they cannot actually be compared.
>
It is true for Swift 2 code. However, whether this is true forever is less
clear. There is a thread here discussing "existential protocols", which AFAIK
would make this code listing into a non-error, and in that thread Douglas
Gregor said:
> Do recall that I’m saying “not now” rather than “not ever” for this feature.
> I think it’s very, very cool, but it’s complicated and we need a while to
> understand its overall effects.
As long as the door is open to allowing the syntax, I think saying something
strong and normative about it in an official proposal would be a mistake. The
example is fine, but the comment should be that this "currently errors" or
"surprises new programmers" or something weaker than "it's obvious to all of us
this shouldn't work" because it's obvious to some people that it should work
after all.
The second thing is that I think using the words "dynamically dispatched" or
"dynamically dispatched interfaces" in the body of the proposal is a mistake.
It is not that interfaces "are" dynamically dispatched. It is that they may
be, e.g. that the compiler may select a dynamic implementation (or it may be
able to find a static implementation), whereas for a protocol the compiler is
guaranteed to use a static implementation. This is I think more consistent
with CL's position on static/dynamic in Swift
<https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20151207/001948.html>
generally. So I think we should find a turn of phrase like "behaves
dynamically" or "has dynamic dispatch semantics" rather than saying "it *is*
dynamically dispatched" as if we will force the optimizer to spit out a vtable
when it can find a static implementation.
With those two details resolved I think it is a strong proposal, and very much
in line with the proposal we're reviewing about separating typealias vs
associatedtype, which strikes at a similar confusion where we're separating two
different concepts into their own keywords.
> On Jan 3, 2016, at 7:44 PM, Austin Zheng via swift-evolution
> <[email protected]> wrote:
>
> +1 to "opening" values of existential type, I remember trying (and failing)
> to do this when Swift 1 came out. Being able to capture the dynamic type of
> an object at runtime and do stuff with it would be incredible.
>
> Austin
>
> On Sun, Jan 3, 2016 at 4:19 PM, David Waite via swift-evolution
> <[email protected] <mailto:[email protected]>> wrote:
> This would be wonderful - is it something that could happen in the Swift 3
> timeframe? Is it something that myself or someone else could work on a formal
> proposal for?
>
> -DW
>
>> On Jan 3, 2016, at 4:17 PM, Douglas Gregor via swift-evolution
>> <[email protected] <mailto:[email protected]>> wrote:
>>
>>
>>> On Jan 3, 2016, at 6:48 AM, Антон Жилин via swift-evolution
>>> <[email protected] <mailto:[email protected]>> wrote:
>>>
>>> Introduction of interfaces will clean up the current blend of static and
>>> dynamic protocols, and solve at least three popular issues.
>>> Please see:
>>> https://github.com/Anton3/swift-evolution/blob/master/proposals/0000-introducing-interfaces.md
>>>
>>> <https://github.com/Anton3/swift-evolution/blob/master/proposals/0000-introducing-interfaces.md>
>> I am *completely* against this proposal.
>>
>> Fundamentally, you're trying to address the limitation that protocols with
>> Self or associated type requirements can't be existential. But it's just a
>> limitation that isn't (conceptually) that hard to fix: the primary operation
>> you need to work with an existing of such a protocol is to "open" a value of
>> existential type, giving a name to the dynamic type it stores. Let's invent
>> one:
>>
>> func eq(x: Equatable, y: Equatable) -> Bool {
>> // give the name T to the dynamic type stored in xT
>> let xT = open x as T
>> // is y also storing a T?
>> guard let yT = y as? T else { return false }
>> // check whether the Ts are equal
>> return xT == yT
>> }
>>
>> Ignore the syntax: semantically, we've gone from a "dynamic" existential
>> thing back to something more "static", just by giving a name to the type.
>> Swift generics aren't really even static in any sense: what the do is give
>> names to the types of values so one can establish relationships among
>> different values. "open..as" would do that for existentials.
>>
>> Note that ether Swift compilers AST and SIL both have "open existential"
>> operations that do this internally. They have no spelling in Swift code, but
>> they are useful to describe operations on existentials. At present, they
>> cannot be formed when the existential involves a protocol with Self or
>> associated type requirements, but that's a limitation that isn't hard to
>> address.
>>
>> As for your concerns about knowing when one can dynamically override and
>> when one cannot... There are issues here that need to be addressed. They
>> aren't significant enough to warrant such a drastic change, and may not even
>> require language changes at all.
>>
>> - Doug
>>
>>
>>
>> _______________________________________________
>> 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