> On Jun 12, 2016, at 4:05 PM, Thorsten Seitz <tseit...@icloud.com> wrote:
> 
>> 
>> Am 12.06.2016 um 09:21 schrieb L. Mihalkovic <laurent.mihalko...@gmail.com 
>> <mailto:laurent.mihalko...@gmail.com>>:
>> 
>> 
>> 
>> 
>> Regards
>> (From mobile)
>> On Jun 11, 2016, at 11:43 PM, Thorsten Seitz <tseit...@icloud.com 
>> <mailto:tseit...@icloud.com>> wrote:
>> 
>>> 
>>> 
>>>> Am 11.06.2016 um 15:08 schrieb L. Mihalkovic <laurent.mihalko...@gmail.com 
>>>> <mailto:laurent.mihalko...@gmail.com>>:
>>>> 
>>>> 
>>>>> On Jun 11, 2016, at 2:05 PM, Thorsten Seitz <tseit...@icloud.com 
>>>>> <mailto:tseit...@icloud.com>> wrote:
>>>>> 
>>>>> 
>>>>>> Am 11.06.2016 um 12:38 schrieb L. Mihalkovic 
>>>>>> <laurent.mihalko...@gmail.com <mailto:laurent.mihalko...@gmail.com>>:
>>>>>> 
>>>>>> 
>>>>>>> On Jun 11, 2016, at 11:30 AM, Thorsten Seitz <tseit...@icloud.com 
>>>>>>> <mailto:tseit...@icloud.com>> wrote:
>>>>>>> 
>>>>>>> 
>>>>>>>> Am 11.06.2016 um 08:00 schrieb L. Mihalkovic 
>>>>>>>> <laurent.mihalko...@gmail.com <mailto:laurent.mihalko...@gmail.com>>:
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> Regards
>>>>>>>> (From mobile)
>>>>>>>>> On Jun 10, 2016, at 9:35 PM, Thorsten Seitz via swift-evolution 
>>>>>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>>> Am 09.06.2016 um 19:50 schrieb Thorsten Seitz via swift-evolution 
>>>>>>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>>:
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>>> Am 09.06.2016 um 18:49 schrieb Dave Abrahams via swift-evolution 
>>>>>>>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>>:
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> on Wed Jun 08 2016, Jordan Rose <swift-evolution@swift.org 
>>>>>>>>>>> <mailto:swift-evolution@swift.org>> wrote:
>>>>>>>>>>> 
>>>>>>>>>>>>> On Jun 8, 2016, at 13:16, Dave Abrahams via swift-evolution
>>>>>>>>>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> 
>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>> on Wed Jun 08 2016, Thorsten Seitz
>>>>>>>>>>>> 
>>>>>>>>>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>>>>>>>>>>> <mailto:swift-evolution@swift.org 
>>>>>>>>>>>>> <mailto:swift-evolution@swift.org>>>
>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>> 
>>>>>>>>>>>>>> Ah, thanks, I forgot!  I still consider this a bug, though (will 
>>>>>>>>>>>>>> have
>>>>>>>>>>>>>> to read up again what the reasons are for that behavior).
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Yes, but in the case of the issue we're discussing, the choices 
>>>>>>>>>>>>> are:
>>>>>>>>>>>>> 
>>>>>>>>>>>>> 1. Omit from the existential's API any protocol requirements that 
>>>>>>>>>>>>> depend
>>>>>>>>>>>>> on Self or associated types, in which case it *can't* conform to
>>>>>>>>>>>>> itself because it doesn't fulfill the requirements.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> 2. Erase type relationships and trap at runtime when they don't 
>>>>>>>>>>>>> line up.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Matthew has been arguing against #2, but you can't “fix the bug” 
>>>>>>>>>>>>> without
>>>>>>>>>>>>> it.
>>>>>>>>>>>> 
>>>>>>>>>>>> #1 has been my preference for a while as well, at least as a 
>>>>>>>>>>>> starting
>>>>>>>>>>>> point.
>>>>>>>>>>> 
>>>>>>>>>>> I should point out that with the resyntaxing of existentials to
>>>>>>>>>>> Any<Protocols...>, the idea that Collection's existential doesn't
>>>>>>>>>>> conform to Collection becomes far less absurd than it was, so maybe 
>>>>>>>>>>> this
>>>>>>>>>>> is not so bad.
>>>>>>>>>> 
>>>>>>>>>> I think the problem is more that Any<Collection> does not conform to 
>>>>>>>>>> a specific value for a type parameter T: Collection
>>>>>>>>>> 
>>>>>>>>>> What I mean by this is that `Collection` denotes a type family, a 
>>>>>>>>>> generic parameter `T: Collection` denotes a specific (though 
>>>>>>>>>> unknown) member of that type family and `Any<Collection>` denotes 
>>>>>>>>>> the type family again, so there is really no point in writing 
>>>>>>>>>> Any<Collection> IMO. 
>>>>>>>>>> The type family cannot conform to T because T is just one fixed 
>>>>>>>>>> member of it.
>>>>>>>>>> It conforms to itself, though, as I can write
>>>>>>>>>> let c1: Any<Collection> = …
>>>>>>>>>> let c2: Any<Collection> = c1
>>>>>>>>>> 
>>>>>>>>>> That’s why I think that we could just drop Any<Collection> and 
>>>>>>>>>> simply write Collection.
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> Let me expand that a bit:
>>>>>>>>> 
>>>>>>>>> Actually all this talk about existentials vs. generics or protocols 
>>>>>>>>> vs. classes has had me confused somewhat and I think there are still 
>>>>>>>>> some misconceptions present on this list sometimes, so I’ll try to 
>>>>>>>>> clear them up:
>>>>>>>>> 
>>>>>>>>> (1) misconception: protocols with associated types are somehow very 
>>>>>>>>> different from generics
>>>>>>>>> 
>>>>>>>>> I don’t think they are and I will explain why. The only difference is 
>>>>>>>>> the way the type parameters are bound: generics use explicit 
>>>>>>>>> parameter lists whereas protocols use inheritance. That has some 
>>>>>>>>> advantages (think long parameter lists of generics) and some 
>>>>>>>>> disadvantages.
>>>>>>>>> These ways are dual in a notation sense: generic types have to have 
>>>>>>>>> all parameters bound whereas protocols cannot bind any of them.
>>>>>>>>> The „existential“ notation `Any<>` being discussed on this list is 
>>>>>>>>> nothing more than adding the ability to protocols to bind the 
>>>>>>>>> parameters to be used just like Java’s wildcards are adding the 
>>>>>>>>> opposite feature to generics, namely not having to bind all 
>>>>>>>>> parameters.
>>>>>>>> 
>>>>>>>> btw, i tried to to see if Any<> could have a simpler alternative
>>>>>>>> https://gist.github.com/lmihalkovic/8aa66542f5cc4592e967bade260477ef 
>>>>>>>> <https://gist.github.com/lmihalkovic/8aa66542f5cc4592e967bade260477ef>
>>>>>>> 
>>>>>>> As you know I like using `&` as type intersection operator. But you 
>>>>>>> write "The syntax leave a void when it comes to expressing the so 
>>>>>>> called Top type:“
>>>>>>> Why? Just give the top type a name, e.g. `Any` and you are done.
>>>>>> Yes.. I just don't like magic. I think that all types should be 
>>>>>> expressable with a syntax and that you can then decide to alias one 
>>>>>> parsing case with a specific name. Not the other way around.
>>>>> 
>>>>> Well, I think that would be backwards, because we have a nominal type 
>>>>> system. That means that the syntax for a type is just its name.
>>>> 
>>>> I realize we do not understand each other. 
>>>> The words we use now to describe a behavior are just that, words. As is 
>>>> the concepts they describe are useless to the computer running the 
>>>> compiler.
>>>> So we need to map these concepts into a heuristic that a fast but dumb 
>>>> computer will be able to reason with. The code to do that will be either 
>>>> clean and organized, or it will look contrived and full of different paths 
>>>> that will be difficult to mesh together. Of all the possible ways in which 
>>>> swift can behave as a language, some will lead to the former, others to 
>>>> the latter code. I think this is not fate or something you find out after 
>>>> the decision was made and you struggle to carry it through. This is 
>>>> something that can partially be predicted. One of the tools for such 
>>>> prediction is to translate the concepts into a grammar that will show 
>>>> formalize the logic. The simpler the logic, the cleaner (not simple) the 
>>>> final code. 
>>>> 
>>>> Saying that the syntax for a type is a name is of no use whatsoever for 
>>>> the compiler implementer. It is so universally true that it cannot help in 
>>>> any way whatsoever decide the shape of the swift grammar, much less the 
>>>> structure of the c++ code implementing it.
>>>> 
>>>>> `&` is a type operator which creates a new type from its operands.
>>>>> `where` clauses add constraints to types.
>>>>> But it all starts with a type's name.
>>>>> 
>>>>> The only magic would be that all type definitions (`protocol` etc.) which 
>>>>> do not give a supertype they conform to, will implicitly conform to 
>>>>> `Any`, i.e.
>>>> 
>>>> I call magic the core notions of swift that cannot be expressed in swift 
>>>> but have to parachutted in by the compiler. If you read Chris' initial 
>>>> message you will see that he said as much, that adopting P&Q as syntax was 
>>>> leaving a gap that the compiler would have to magically fill. 
>>>> 
>>>> 
>>>>> 
>>>>> protocol Foo { … }
>>>>> 
>>>>> means
>>>>> 
>>>>> protocol Foo : Any { … }
>>>>> 
>>>>> That’s less magic than creating a special syntax just to express the top 
>>>>> type.
>>>> 
>>>> I will try again... Would it be easier to understand it if instead of 
>>>> magic I said arbitrary?  You are creating a special case: you decide 
>>>> arbitrarily that the special series of characters 'A' 'n' 'y' with this 
>>>> precise casing and without any spaces is going to be adorned with a 
>>>> special meaning when used in specific situations. This is not something 
>>>> you deduced. My approach is exactly the opposite:  _[] does not describe 
>>>> the top type because I have a special affinity with these characters, it 
>>>> describes the top type because it is the only possible logical conclusion 
>>>> from having followed a set of rules attached to a syntax that describes 
>>>> ALL existentials. And because it is not particularly savory, I typealias 
>>>> it to something else. But this is not in the compiler, it us in the 
>>>> standard linrary... inside swift, not outside.
>>> 
>>> Ok, that's a good argument. But your proposal does not contain those rules.
>>> Why should _[] describe the top type? You just say this in your proposal, 
>>> but you do not define rules what _[] means.
>>> _[A,B] 
>> 
>> don't know where this comes from. This is incorrect and the parser would 
>> reject it.
>> 
>>> describes the type intersection of A and B, i.e. it contains all members of 
>>> A which are also members of B. _[] does not list any types, so one might 
>>> conclude that it has no members and therefore must be the bottom type!
>> Are you saying that protocol<> is the bottom type of Swift then? Because if 
>> you disect the logic it follows to explain why it is a top type and apply 
>> the exact same reasoning to  _[] then you should reach the same conclusion 
>> {same effects produce the same conclusions}
>> 
>>> Or _[A,B] in reality means _[A,B,Any],i.e. A & B & Any which of course is 
>>> equal to A & B. Then _[] would just mean Any, but we would have had to 
>>> introduce the top type explicitly again.
>> From cause to effects. Any is an effect (a conclusion we reach) rather than 
>> a cause (something we posit before starting the discussion). Like I 
>> explained, Any is a stdlib provided convenient typealias for _[] as opposed 
>> to a parachuted concept born inside the compiler. Btw, it means a different 
>> stdlib could redefine it as All, without altering the compiler. Any is not 
>> core to swift's structure, but _[] is because it is borne out of the 
>> mechanical uniformity of the grammar.
>> 
>>> On the other hand if we declare a protocol Any and define protocol A {...} 
>>> to mean protocol A: Any {...} there is not really something special in the 
>>> compiler except for adding the conformance which seems very minor to me. 
>>> Everything else is just standard behavior of the type system.
>> 
>> You are back to adding some magic that I just demonstrated is not required 
>> if the grammar is simple (not that i could add it to my grammar to please 
>> you, but then it would not eliminate any of the other definitions, and would 
>> just complicate the parser and type checker to ensure that people use it 
>> correctly. Per Ockham's principle, the system i describe is a better 
>> alternative.
>> 
>>> 
>>> 
>>>> Read Chris' original announcement.. He describes P&Q as it would be 
>>>> adopted today as being just a CORNER CASE of a single general principal... 
>>>> a single grammar that can work today to describe P&Q as well as generalize 
>>>> existentials tomorrow. No special treatment, single parser, single rule. I 
>>>> don't like to write un-necessary IF statements in code.
>>> 
>>> Sorry, I do not understand what you mean here: where would you have to 
>>> write unnecessary if-statements?
>> 
>> Close your eyes and make a mental representation of what the code to 
>> implement the Any<....> proposal will necessarily look like... that is what 
>> I am referring to. That code cannot not be uggly. Because some of of things 
>> a parser typically should catch are not discernsble, and therefore have to 
>> be differed to the type checker. By comparison, look at the grammar I wrote 
>> and picture the code to implement it. The picture will look very different, 
>> and the parser can already eliminate a lot of things that never reach the 
>> type checker.
>> 
>>> 
>>> 
>>>> 
>>>>>>> Why should the top type have special *syntax*? It is just the type all 
>>>>>>> other types conform to. No need to do something special here and 
>>>>>>> therefore no need to invent an alternative syntax like `Any<>` or the 
>>>>>>> alternative from your gist which is rather confusing IMO (and I don’t 
>>>>>>> like the special case given to classes in the syntax).
>>>>>> The _[] case is just a degenerate case of the syntax, showing that it is 
>>>>>> expressible inside, as opposoed to have to define a contextual keyword 
>>>>>> (read the SourceKit code). And then it is aliasable. Part of the 
>>>>>> problems in swift today to me is that some things are no doable in 
>>>>>> swift, so the compiler must contain that semantic. This here is just one 
>>>>>> example, but there are others. These are notions that the standard 
>>>>>> library has to defer to the compiler. Some of them have been tabled for 
>>>>>> 4.0 it seems. My point here was that it is not fate, and choosing the 
>>>>>> syntax carefully for existentials (whichever it is, i don't really care 
>>>>>> inthe end) would prevent having to add a magic keyword for to top type 
>>>>>> to the compiler and to SourceKit again (they are trying to remove them).
>>>>> 
>>>>> `Any` would *not* be a keyword. It is just a type name like `Collection` 
>>>>> or `Int`. Like I said, the only magic would be in adding `: Any` to type 
>>>>> definitions without a conforming clause.
>>>> 
>>>> I hope that by now you understand what magic I was talking about.
>>>> 
>>>>> 
>>>>>> 
>>>>>> As for the current Any<...> proposal for generalizing existentials it is 
>>>>>> IMHO cluncky and magic. There is nothing stopping us mechanically from 
>>>>>> entering Any<UITableView, UIButton>. To me that is the holemark of bad 
>>>>>> design. In what I tested you just can't do it and the reason is clear. 
>>>>>> Of course when I
>>>>> 
>>>>> `Any<UITableView, UIButton>` is just an intersection type and would be 
>>>>> written UITableView & UIButton. And, yes, that would be ok, because it 
>>>>> would be just the empty set, i.e. the bottom type (which has no members). 
>>>>> There is no magic involved, it is just the normal result of an 
>>>>> intersection: each type is a set containing all instances of this type 
>>>>> (instances conforming to it)
>>>> 
>>>> You can't be serious? You are saying that to you the ide should not be 
>>>> telling us we are writting an absurdity? And this one was obvious, but it 
>>>> gets a lot worse with more complex types.
>>> 
>> 
>> Take a screenshot next time you see a "let x:Any<UITableView, UIButton>" in 
>> an app and send it to me. The absurdity would be for the compiler to 
>> generate a binary, the app to start, and us to wonder why x the code 
>> depending on x would never execute. Seems obvious to you why now? 
> 
> I’m taking an example from Gavin King’s presentation about Ceylon instead 
> which can be found here: 
> https://greenjug.java.net/resources/CeylonEastCoastTour20141016.pdf 
> <https://greenjug.java.net/resources/CeylonEastCoastTour20141016.pdf>

my understanding is that dave is the type system designer. I will let the two 
of you finish this conversation and just read. 

very best



> 
> <PastedGraphic-1.tiff>
> 
> Object is the abstract supertype of all types representing definite values, 
> i.e. which are not null. Remember that in Ceylon Optional<T> is modeled as 
> type union T | Null, where Null is the type containing the single member null 
> (i.e. nil in Swift).
> Element is the type parameter for the elements of Iterable.
> 
> Element might be String | Null, for example (in Ceylon abbreviated as String? 
> just like in Swift).
> Element & Object can only be String, because Null & Object is empty, i.e. is 
> the bottom type:
> 
> (String | Null) & Object = (String & Object) | (Null & Object) = String | 
> Bottom = String
> 
> So, while you don’t see UITableView & UIButton here, there is Null & Object 
> at work which yields the bottom type, just like UITableView & UIButton would. 
> If this was forbidden, then how would the type system be able to simplify the 
> expression (String | Null) & Object?
> 
>> 
>> not debatting past here I can't see how it relates (it is interesting but 
>> you may want to look at the whole thing from a 'whats usefull' perspective, 
>> rather than as 'whats combinatorially possible‘
> 
> Like the slide above hopefully demonstrated this is not just a nice 
> theoretical exercise but it *is* useful if you use the whole abstraction and 
> do not try to arbitrarily single out special cases as forbidden.
> 
> Of course, writing UITableView & UIButton is not useful, but writing 
> something like T & Object is, but it needs the whole general mechanism to 
> work.
> (And that general mechanism will show you automatically that UITableView & 
> UIButton is not useful, because you can’t call any method on it, *without* 
> having to introduce compiler magic or IDE magic to explicitly forbid this.)
> 
> Hope that made sense now :-)
> 
> -Thorsten
> 
> 
> 
>> 
>>> Why is an empty intersection absurd? The beauty is that all type 
>>> expressions sort out automatically by applying simple set rules. And it 
>>> actually does make sense!
>>> 
>>> struct Set<T> {
>>>    // answer any one element
>>>    func any() -> T?
>>> }
>>> func intersect<T, U>(a: Set<T>, b: Set<U>) -> Set<T & U> {...}
>>> 
>>> let x: Set<UITableView> = ...
>>> let y: Set<UIButton> = ..
>>> let z = intersect(x, y) // has type Set<Bottom>
>>> z.any // has type Optional<Bottom> and therefore can only be nil
>>> 
>>> Therefore the type system statically knows that the intersection of those 
>>> sets is always empty. No need to declare this as invalid. It just works 
>>> correctly and gives the results you would expect without need for special 
>>> casing and compiler magic (which we both would like to keep small).
>>> 
>>> -Thorsten 
>>> 
>>> 
>>>>> . Intersecting two sets might result in an empty set. The type denoting 
>>>>> the empty set is the bottom type which is the subtype of all types and 
>>>>> might be called `Nothing` or `Never` or `Bottom`.
>>>>> Ceylon makes very nice use of type intersections and type unions and the 
>>>>> beautiful thing is that these type operations really just work like you 
>>>>> would expect if you think of types as sets (which is the standard 
>>>>> definition for a type AFAIK). No surprises and no magic there!
>>>>> 
>>>>> So it is *not* a sign of bad design, quite to the contrary! What did you 
>>>>> test it with? Probably not Ceylon, because otherwise you would have seen 
>>>>> that it just works.
>>>> 
>>>> Hey, who knows, ceylon may one day come to llvm... 
>>>> 
>>>>> 
>>>>> 
>>>>>> say you can't I do not mean that your keyboard will zap u if you try. 
>>>>>> But the way to verify correctness is different... and in a world where 
>>>>>> xcode would be a good ide, then code completion would even show you why 
>>>>>> and actually truly assist (because the grammar i tested makes really 
>>>>>> makes it possible). I know that xcode is only as good as SourceKit lets 
>>>>>> it be.
>>>>>> 
>>>>>>>> 
>>>>>>>>> Essentially `Any<Collection>` in Swift is just the same as 
>>>>>>>>> `Collection<?>` in Java (assuming for comparability’s sake that 
>>>>>>>>> Swift’s Collection had no additional associated types; otherwise I 
>>>>>>>>> would just have to introduce a Collection<Element, Index> in Java).
>>>>>>>>> 
>>>>>>>>> Likewise `Any<Collection where .Element: Number>` is just the same as 
>>>>>>>>> `Collection<? extends Number>` in Java.
>>>>>>>> Java supports co/contra variant params
>>>>>>> 
>>>>>>> Java has no declaration-site variance like Ceylon or Scala have (see 
>>>>>>> e.g. 
>>>>>>> http://ceylon-lang.org/blog/2014/07/14/wildcards#why_i_distrust_wildcards_and_why_we_need_them_anyway
>>>>>>>  
>>>>>>> <http://ceylon-lang.org/blog/2014/07/14/wildcards#why_i_distrust_wildcards_and_why_we_need_them_anyway>).
>>>>>>> 
>>>>>>> Java’s wildcards are a way to express use-site variance. The proposed 
>>>>>>> `Any<>` does just the same. 
>>>>>>> 
>>>>>>> 
>>>>>>>> 
>>>>>>>>> And just like Collection<?> does not conform to a type parameter `T 
>>>>>>>>> extends Collection<?>` because Collection<?> is the type `forall E. 
>>>>>>>>> Collection<E>` whereas `T extends Collection<?>` is the type `T. 
>>>>>>>>> Collection<T>` for a given T.
>>>>>>>> 
>>>>>>>> This picture is accurate today, but there are going to be more serious 
>>>>>>>> differences after 10 no date is currently geven for when it will come)
>>>>>>> 
>>>>>>> You mean Java 10?
>>>>>> 
>>>>>> Yes. After 10. Than is their only date hint.
>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>>> 
>>>>>>>>> In essence protocols with associated types are like generics with 
>>>>>>>>> wildcards.
>>>>>>>> 
>>>>>>>> Yes, java has kept everything within its generics system rather than 
>>>>>>>> split parts out. Something people may not immediately think about with 
>>>>>>>> respect to the 2 generic systems is that when u call a 
>>>>>>>> func<T>capture(T t){}  in java with a wildcard you are doing a compile 
>>>>>>>> time capture only (to avoid the dreaded unsafe casts), whereas it is 
>>>>>>>> really nice to do the same in swift and subsequently be able to access 
>>>>>>>> T.Type and see that it is not Any. The closest u ever get to that type 
>>>>>>>> at runtime in java is via generics introspection, but u still can't do 
>>>>>>>> everything ( like no new T() ). But today the bridging between 
>>>>>>>> existential types and generics is definitely a work in progress.
>>>>>>>> 
>>>>>>>>> Coming back to the questions whether (a) allowing existentials to be 
>>>>>>>>> used as types is useful and (b) whether sacrificing type safety would 
>>>>>>>>> somehow be necessary for that, I think we can safely answer
>>>>>>>>> (a) yes, it *is* useful to be able to use existentials like 
>>>>>>>>> Any<Collection> as types, because wildcards are quite often needed 
>>>>>>>>> and very useful in Java (they haven’t been added without a reason)
>>>>>>>> 
>>>>>>>> IMO they made java 8 (referring to streams). And even though the 
>>>>>>>> syntax for co/contra variance is pretty heavy, it is the foundation 
>>>>>>>> for all modern java code. The any-fication of the generics is going to 
>>>>>>>> open new doors as some of it will translate into a partial reification 
>>>>>>>> in the jvm. It seems the decision for now is to not use the extra info 
>>>>>>>> in java to retain binary compatibility with all the erased code out 
>>>>>>>> there, this is something scala might use in areas where it won't mind 
>>>>>>>> loosing java compatibility.
>>>>>>>> 
>>>>>>>>> (b) no, sacrificing type safety does not make sense, as the 
>>>>>>>>> experience with Java’s wildcards shows that this is not needed. 
>>>>>>>>> Especially if something like path dependent types is used like 
>>>>>>>>> proposed and some notation to open an existential’s type is added, 
>>>>>>>>> which is both something that Java does not have.
>>>>>>>> 
>>>>>>>> I hope typesafe opening inside the " if let " syntax gets added. I 
>>>>>>>> know that chris is against sugaring, but I played if an implementation 
>>>>>>>> of
>>>>>>>> 
>>>>>>>> ... x is String?
>>>>>>>> If let! x {}
>>>>>>>> That runs as
>>>>>>>> if let x = x {}
>>>>>>>> 
>>>>>>>> something equally short could be done here.
>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> (2) misconception: POP is different from OOP
>>>>>>>>> 
>>>>>>>>> It is not. Protocols are just interfaces using subtyping like OOP has 
>>>>>>>>> always done. They just use associated types instead of explicit type 
>>>>>>>>> parameters for generics (see above). The more important distinction 
>>>>>>>>> of Swift is emphasizing value types and making mutation safely 
>>>>>>>>> available by enforcing copy semantics for value types.
>>>>>>>> 
>>>>>>>> Values are coming to the jvm, which will narrow this gap (like their 
>>>>>>>> view identity for value vs ref and the whole deep ==) . I also really 
>>>>>>>> like the cow approach of the swift runtime.
>>>>>>>> 
>>>>>>>>> But protocols are not really different from interfaces in Java.
>>>>>>>> 
>>>>>>>> There is one big difference: default methods, but it seems swift will 
>>>>>>>> add that soon.
>>>>>>> 
>>>>>>> Swift already has default extension methods, doesn’t it?
>>>>>> 
>>>>>> Yes, and no. It has differently dispatched code that can be found to 
>>>>>> fill in the gap of the conformance req, yes. But Joe Grof (?) said that 
>>>>>> there are no reasons why these could not be added. Having true defaults 
>>>>>> could be one way to deal with optional comformance…
>>>>> 
>>>>> The dispatch issue only arises for extensions introducing a method that 
>>>>> is not declared in a protocol. That is something you *cannot* do in Java. 
>>>>> Java’s default methods are implementations for methods declared in 
>>>>> interfaces. Swift’s extension methods providing defaults for methods 
>>>>> declared in a protocol are dynamically dispatched and should work like 
>>>>> Java’s default methods.
>>>> 
>>>> I think we should agree to disagree.
>>>> 
>>>> 
>>>>> (One caveat exists with subclasses where the superclasses didn’t 
>>>>> implement the method because I then am not allowed to `override` the 
>>>>> default method but that is a bug IMO).
>>>>> 
>>>>> -Thorsten
>>>>> 
>>>>> 
>>>>> 
>>>>>> 
>>>>>> protocol MyProto {
>>>>>> func mustImplement()
>>>>>> default canImplement() { } 
>>>>>> }
>>>>>> 
>>>>>> Related data there:
>>>>>> https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160516/018560.html
>>>>>>  
>>>>>> <https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160516/018560.html>
>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>>> I also really like how extensions and conformance mix together in 
>>>>>>>> swift to bake retro-modelling in and the adapter pattern (spent enough 
>>>>>>>> years deep diving inside eclipse to appreciate it).
>>>>>>>> 
>>>>>>>>> I would have preferred a unified model using just classes with real 
>>>>>>>>> multiple inheritance like Eiffel has and value types just being a 
>>>>>>>>> part of that similar to Eiffel’s `expanded` classes. But that ship 
>>>>>>>>> has probably sailed a long time ago :-/
>>>>>>> 
>>>>>>> I like extensions very much (having used Smalltalk for a long time). I 
>>>>>>> like enums for the pattern matching and structs as value types. But 
>>>>>>> having to split protocols off instead of using abstract classes makes 
>>>>>>> things more complicated IMO.
>>>>>>> 
>>>>>>>> -1  i am old school c/c++...  i really like protocol, struct, class, 
>>>>>>>> extensions, enums. It is a really nice mix that gives objc people room 
>>>>>>>> to grow, but I do miss how they are an integral part of generics (i 
>>>>>>>> protocols as a replacement and look forward to when they interact 
>>>>>>>> better) and namespaces+scoped-imports (c#)... Looking forward to where 
>>>>>>>> things go next
>>>>>>> 
>>>>>>> Yeah, namespacing/submodules/conflict resolution (when doing imports 
>>>>>>> but also when conforming to multiple protocols which has just the same 
>>>>>>> problems) are still missing. But I’m optimistic :-) Let’s complete 
>>>>>>> generics first, then tackle existentials/type intersections.
>>>>>> 
>>>>>> I think I care more about existentials, but only because of the kind of 
>>>>>> java i wrote for a living. I just looked at a bunch of opensource swift 
>>>>>> libs (particularly for server side swift)... some of it is a real 
>>>>>> engineering disaster: 20+ folders, each with 2 source files... or 3 
>>>>>> folders "extensions" "utils" "classes". Swift is currently not equiped 
>>>>>> for people to write big things with... I wish the team would address it 
>>>>>> sooner than later (look at their own c++ code to see the difference). 
>>>>>> IMHO import conflicts are more often the symptom of bad code than a real 
>>>>>> issue.
>>>>> 
>>>>> Alas, most languages suffer from poor module systems. A good module 
>>>>> system should not only allow resolving conflicts between modules and 
>>>>> making it possible to structure code well, but solve the issue around 
>>>>> versioned modules so that is is possibly to safely use different versions 
>>>>> of the same module in the same application.
>>>>> 
>>>>> -Thorsten
>>>>> 
>>>>> 
>>>>>> 
>>>>>> Cheers
>>>>>>> 
>>>>>>> -THorsten
>>>>>>> 
>>>>>>> 
>>>>>>>> 
>>>>>>>>> So be it. But at least there should be no reasons for POP vs OOP wars 
>>>>>>>>> ;-)
>>>>>>>>> (I’d like to add that I liked Dave’s talks at last WWDC very much, 
>>>>>>>>> it’s just that I don’t think that POP is something new or different.)
>>>>>>>> 
>>>>>>>> I used to thin that way. But today I think that although in broad 
>>>>>>>> brush strokes the similarities and bigger than the differences, there 
>>>>>>>> is room for making a bigger difference in the how.
>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> -Thorsten
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> _______________________________________________
>>>>>>>>> swift-evolution mailing list
>>>>>>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>>>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to