> On Jun 9, 2016, at 11:12, L Mihalkovic <[email protected]> wrote:
> 
>> 
>> On Jun 9, 2016, at 8:01 PM, Thorsten Seitz <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>>> 
>>> Am 09.06.2016 um 19:46 schrieb L Mihalkovic via swift-evolution 
>>> <[email protected] <mailto:[email protected]>>:
>>> 
>>>> 
>>>> On Jun 9, 2016, at 7:04 PM, Jordan Rose <[email protected] 
>>>> <mailto:[email protected]>> wrote:
>>>> 
>>>>> 
>>>>> On Jun 9, 2016, at 07:35, L. Mihalkovic <[email protected] 
>>>>> <mailto:[email protected]>> wrote:
>>>>> 
>>>>> 
>>>>> On Jun 9, 2016, at 3:27 AM, Jordan Rose via swift-evolution 
>>>>> <[email protected] <mailto:[email protected]>> wrote:
>>>>> 
>>>>>> Hi, Paulo. Thanks for bringing this up; it’s definitely an interesting 
>>>>>> problem to solve.
>>>>>> 
>>>>>> My thoughts are mostly in line with yours, that disambiguation at the 
>>>>>> call site is the most Swift-like thing to do, at least as a first step. 
>>>>>> Maybe we can add some way to record general preferences, or maybe just 
>>>>>> asking people to define a wrapper function to put the disambiguation in 
>>>>>> one place is fine.
>>>>>> 
>>>>>> I’m not particularly a fan of the “from” syntax or the “@“ syntax, but I 
>>>>>> don’t have anything better. (And the “not a fan” is entirely a taste 
>>>>>> thing, plus a general desire not to steal new keywords or operator 
>>>>>> characters. Neither of these are blockers.) I’ve been playing with silly 
>>>>>> things like this:
>>>>>> 
>>>>>> str.(ModuleA.capitalized)()
>>>>>> 
>>>>> 
>>>>> Seeing all these proposals that people make, it makes me thinks that 
>>>>> extensions as they exist are not fully understood... People seem to 
>>>>> consider them  like the Xtext/Xtend/c# extension METHODS, which means 
>>>>> that maybe they should also be added to Swift, and people would not be 
>>>>> confused:
>>>>> 
>>>>> public static func capitalized(self:String)() {}    
>>>>> 
>>>>> Then these would be easily individually imported from module x,y or z 
>>>>> with the current syntax, and then "extension String {}" would retain it 
>>>>> current scoping behavior
>>>>> 
>>>>> No matter what, I think many extensions are just a bad outlook on OOD, 
>>>>> but properly understood, they are great.
>>>> 
>>>> I’m not sure what you mean. How does changing the declaration site solve 
>>>> the disambiguation problem at the call site? (And how do you think Swift 
>>>> extensions differ from C# extensions?)
>>>> 
>>> 
>>> sorry, I thought the example was clearer than it actually is (pb with 
>>> writing thgs in a train)
>>> 
>>> 
>>> This is code I wrote a couple weeks ago (parsing some WWDC related things 
>>> in C#):
>>> namespace HtmlAgilityPackPlus {
>>>     using HtmlAgilityPack;
>>> 
>>>     public static class Extender {
>>>         public static HtmlNode ChildOfType(this HtmlNode node, string name) 
>>> {
>>>             var n = node.ChildNodes.Where( x => x.Name == name).First();
>>>             return n;
>>>         }         
>>>         public static HtmlNode FirstLink(this HtmlNode node) {
>>>             var child = node.ChildOfType("a");
>>>             return child;
>>>         }
>>>         public static HtmlNode FirstDescendantMatching(this HtmlNode node, 
>>> Func<HtmlNode, bool> predicate) {
>>>             var seq = node.Descendants().Where( x => predicate(x) );
>>>             return ((seq?.Count() ?? 0) > 0) ? seq.First() : null;
>>>         }
>>>     }
>>> }
>>> 
>>> XText and XTend work the same (I think at some point so did kotlin, but I 
>>> haven’t checked since the final)
>>> 
>>> 
>>> Now this is some Swift code (yes I am not bothering with the details)
>>> module A ===
>>> 
>>> extension String {
>>>     func oneA() {  }
>>>     func twoA() {  }
>>>     func threeA() {  }
>>> }
>>> 
>>> 
>>> module B ===
>>> 
>>> extension String {
>>>     func oneB() {  }
>>>     func twoB() {  }
>>>     func threeB() {  }
>>> }
>>> 
>>> We could say that the Swift extension is a ‘batch’ oriented mechanism: 
>>> first a target type is decided by forming a scope
>>> then many extension methods can be added together
>>> Of course one can also add a single method at a time in as many single 
>>> scopes. But the fact remains.. the syntax is oriented towards 
>>> anonymity of the source
>>> batch adds
>>> 
>>> as you can see, this is not how C# works.
>>> 
>>> So now, given that context, I was suggesting that people seem to consider 
>>> Swift extensions as something they currently are NOT: there is no way to 
>>> pinpoint a particular extension in a particular module (import the module, 
>>> inherit its extensions), there is NO way to target a given method in a 
>>> given extension in a given module.
>>> 
>>> 
>>> My point was to suggest that it may show that current extensions are 
>>> invaluable for something like the adapter pattern (than you E. Gamma), but 
>>> not entirely suited for the more fine-grained scenario that people keep use 
>>> in the mail thread.
>>> 
>>> This led to my proposal to ALSO support (not REPLACE) 
>>> 
>>> module A ===
>>> extension String {
>>>     func oneA() {  }
>>>     func twoA() {  }
>>>     func threeA() {  }
>>> }
>>> // more like the GO syntax
>>> public static func 
>>> indexOfSubStringInReversedOrder(self:String)(pattern:String) -> Int {}    
>>> 
>>> 
>>> module B ===
>>> extension String {
>>>     func oneB() {  }
>>>     func twoB() {  }
>>>     func threeB() {  }
>>> }
>>> // more like the c#/XText/XTend/... syntax
>>> public static func indexOfSubStringInReversedOrder(self:String, 
>>> pattern:String) -> Int {}    
>>> 
>>> because we can now do the following without altering anything
>>> 
>>> import func moduleA.indexOfSubStringInReversedOrder
>>> var idx = "blahblahXYZblah".indexOfSubStringInReversedOrder("zyx")
>>> _______________________________________________
>> 
>> 
>> What hinders me in the case of Swift’s extensions to write
>> 
>> import func moduleA.String.oneB
>> 
>> This would achieve just the same thing.
>> 
> 
> hmmm….. I know… tempting, right?!    but how then does this not DESTROY the 
> other behavior?!  “compiler, be smart… if I say nothing, then let the runtime 
> loader import everything everywhere because it is still very useful even if I 
> don’t want to recognize it right now. But then if I start to import 
> something, then tell the runtime loader that he has to stop mocking about 
> with all these extension blocks to String that he will find and just add the 
> one method that I care about. and btw, remember to the other thing in all my 
> other source files” I look forward to read the source code that will make it 
> work, because I know I do not have the beginning of the imagination required 
> to have a clue how it will look like.

I'm really not sure what you're talking about. Extension methods are resolved 
at compile-time, not run-time. (Except @objc extension methods, which are as 
dangerous as categories ever were, and which isn't changing.)

Jordan
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to