One more thing, I would also add the ability to allow something like this:

protocol A {}  
protocol B {}

// Here `type` can be `protocol`, `class`, `struct` or `enum`.
type C: any<A, B> {}
Where today is only possible to express something like this:

protocol A {}  
protocol B {}

typealias AB = any<A, B>

// Here `type` can be `protocol`, `class`, `struct` or `enum`.
type C: AB {}
This is a lack of functionality.



-- 
Adrian Zubarev
Sent with Airmail

Am 21. Mai 2016 bei 05:16:24, Matthew Johnson via swift-evolution 
([email protected]) schrieb:


On May 20, 2016, at 10:07 PM, Austin Zheng <[email protected]> wrote:

These aren't really my points, I just copied them out of the other sub-thread. 
I'm sure there will be a separate review period, during which many more people 
will probably join in with their opinions :).

I understand that.  You asked for any other thoughts before you update your 
proposal.  I am sharing my thoughts.  :)  Feel free to use them in the proposal 
if desired.


Austin

On Fri, May 20, 2016 at 7:59 PM, Matthew Johnson <[email protected]> wrote:

On May 20, 2016, at 9:10 PM, Austin Zheng <[email protected]> wrote:

(Trying to move the conversation back to this thread to un-hijack Adrian's 
thread.)

In terms of Any<> vs any<>, I don't have any strong feelings and I think there 
are good arguments on both sides. I'm going to leave the proposal as Any<> but 
put a section in the 'Alternatives' discussing Any<> vs any<>, so that if it 
does go up for review the core team can review arguments and maybe choose one 
they like.

Thanks for the summary.  I think this is helpful.  


Any<> pros:
- The convention is to capitalize types. 'Any<A, B>' is immediately apparent as 
a type, and looks like a type when used in places where types would be used 
(like function signatures)
- Having 'Any<>' allows us to keep the well-established 'Any' without having to 
typealias to 'any' or 'any<>’ forms

How so?  you can’t just use `protocol` naked today.  You have to say 
`protocol<>`.  `Any` is a typealias for that.  This means we either have a 
typealias, we type out `Any<>` or we type out `any<>`.  We don’t get to just 
type `Any` or `any` without a typealias just because we change the keyword.

And I do agree that typealias for existentials should be capitalized.  These 
are types and behave identically to any other type.

- any is a keyword, but an argument can be made that keywords that fit into a 
particular syntactic slot should be capitalized like normal members of that 
slot. Any<> fits into the slot of types, so it should be named like a type
- In the future, AnySequence and friends can be replaced with, e.g. 
Any<Sequence>.
This increases discoverability of existential features, like a future 
"Any<Sequence where .Element == Int>". A number of developers have mentioned 
that they suspect protocol<> is rarely used, although GitHub's search makes it 
impossible to quantify.

If protocol<> is rarely used it is probably because it is a very limited 
feature at this point.  It becomes extremely useful when we can constrain 
associated types.  

When that is possible and the community shares knowledge about how to use it it 
will become a widely used feature.  I don’t think upper / lower case or 
`typealias AnySequnce<T> = Any<Sequence where .Element == T>` will make much 
difference either way.


any<> pros:
- any<>'s lower case 'a' distinguishes it from other generic types that use 
similar syntax, such as "Array<Int>". Perhaps developers, especially those new 
to Swift, will be confused as to why "Any<A, B>" isn't a generic type, but 
"Dictionary<A, B>" is.

The reason this is important is that generic types can be used in ways that Any 
cannot.  Thus the likely point of confusion is why the following is not valid:

struct Foo<T, U> {
    func foo(bar: Any<T, U>) { ... }
}

If we use lowercase it gives the user a hint as to why they might not be able 
to use it in all of the same ways as a generic type, especially because Swift 
is developing strong and consistent conventions for keywords.  If we use 
uppercase here, not only do we introduce potential confusion in this case, we 
also water down the meaning of those conventions and make the language slightly 
less predictable. (i.e. users might wonder: are there other uppercase 
generic-type-like constructs that don’t quite behave like normal generic types?)

New developers aside, it may be jarring to have to mentally 'context switch' 
between Any<A, B> as an existential, and AnythingButAny<A, B> as a generic type.
- any's lower case 'a' makes it clear to users it's not a 'normal' type, but 
rather a construction that can be used as a type in some cases, and can't be 
used everywhere a concrete type can.

Existential types can be used anywhere concrete types can.  The difference is 
that Any as a type constructor behaves much differently than other type 
constructors (generic structs, enums, and classes).  

- 'any' isn't a specific type - it's a kind of type (an existential), and this 
spelling fits better with the other 'kind' names: 'class', 'struct', 'enum', 
'protocol'
- any is a keyword, and keywords are lower case. Perhaps consistency in this 
matter is more important.

Any other thoughts? I will submit an amendment tonight if people are okay with 
this.

I have one additional thought.  Brent’s rule is based on *exempting* keywords 
from the usual rule of lowercase.  IMO that exemption should be reserved for 
cases where the keyword in question can be used in all of the same was that the 
similar syntactic form can be used.  I believe the fact that this is not the 
case for Any is a strong argument to preclude it from receiving the exemption.

To be perfectly honest, I do prefer `Any` from an aesthetic / readability 
standpoint.  But I also think the consistency and usability arguments point in 
the other direction.

When all has been decided I will happily use whatever is decide in my own code. 
 :-)


Austin


On May 18, 2016, at 10:35 PM, Austin Zheng <[email protected]> wrote:

Hello all,

Swift 3.0 focuses on making breaking changes that prepare the way for features 
to be introduced in future releases. In that spirit, I would like to solicit 
feedback on a very simple proposal: renaming 'protocol<>' to 'Any<>', as 
described in the 'Completing Generics' manifesto.

The proposal can be found here: 
https://github.com/austinzheng/swift-evolution/blob/az-protocol-to-any/proposals/XXXX-any-as-existential.md

Best,
Austin




_______________________________________________
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