<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div><blockquote type="cite" class=""><div class="">On Dec 27, 2015, at 4:54 PM, Wallacy &lt;<a href="mailto:wallacyf@gmail.com" class="">wallacyf@gmail.com</a>&gt; wrote:</div><div class=""><div dir="ltr" class=""><div class="">How to differentiate these functions?</div></div></div></blockquote><div><br class=""></div>Doug talked about this some in his proposal.</div><div><br class=""></div><div>John.</div><div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class=""><br class=""></div><div class="">class A{</div><div class="">&nbsp; &nbsp; func someFunc(a: Int) -&gt; Int{</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; return 0;</div><div class="">&nbsp; &nbsp; }</div><div class="">&nbsp; &nbsp; func someFunc(a: Int) -&gt; Double{</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; return 0;</div><div class="">&nbsp; &nbsp; }</div><div class="">&nbsp; &nbsp; func someFunc(a: Double) -&gt; Int{</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; return 0;</div><div class="">&nbsp; &nbsp; }</div><div class="">&nbsp; &nbsp; func someFunc(a: Double) -&gt; Double{</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; return 0;</div><div class="">&nbsp; &nbsp; }</div><div class=""><div class="">&nbsp; &nbsp;func someFunc(a: Int, b: Int) -&gt; Int{</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; return 0;</div><div class="">&nbsp; &nbsp; }</div></div><div class="">}</div><div class=""><br class=""></div><div class="">Even with backticks would not be possible.<br class=""></div><div class=""><br class=""></div><div class="">You may need to reference the method signature altogether.</div><div class=""><br class=""></div><div class="">var someA = A()</div><div class=""><b class="">let fn1 = someA.#someFunc(a: Int) -&gt; Int<br class=""></b></div><b class="">let fn2 = someA.#someFunc(a: Int) -&gt; Double <br class="">let fn3 = someA.#someFunc(a: Double) -&gt; Int <br class="">let fn4 = someA.#someFunc(a: Double) -&gt; Double</b><div class=""><br class=""></div><div class="">An operator at the beginning perhaps?</div><div class=""><br class=""></div><div class=""><div class="">let fn1 = #someA.someFunc(a: Int) -&gt; Int</div><div class="">let fn2 = #someA.someFunc(a: Int) -&gt; Double</div><div class="">let fn3 = #someA.someFunc(a: Double) -&gt; Int</div><div class="">let fn4 = #someA.someFunc(a: Double) -&gt; Double</div></div><div class=""><br class=""></div><div class=""><div class=""><br class=""></div><div class="">You may not need the full signature all the time, only necessary to differentiate.</div></div><div class=""><br class=""></div><div class=""><div class="">extension A {</div><div class="">&nbsp; &nbsp; func someOtherFunc(a: Int, b: Int) -&gt; Int{</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; return 0;</div><div class="">&nbsp; &nbsp; }</div><div class="">&nbsp; &nbsp; func someOtherFunc(){</div><div class="">&nbsp; &nbsp; }</div><div class="">&nbsp; &nbsp; func someOther(){</div><div class="">&nbsp; &nbsp; }</div><div class="">}</div></div><div class=""><br class=""></div><div class=""><div class=""><b class="">let fn5 = someA.#someOtherFunc(a:, b:)</b></div><div class=""><b class="">let fn6 = someA.#someOtherFunc()</b></div><div class=""><b class="">let fn6 = someA.someOther</b></div></div><div class=""><br class=""></div><div class="">Another possibility:<br class=""></div><div class=""><br class=""></div><div class=""><div class=""><b class="">let fn5 = #(someA.someOtherFunc(a:, b:))</b></div></div><div class=""><div class=""><b class="">let fn5 = @(someA.someOtherFunc(a:, b:))</b></div></div><div class=""><b class=""><br class=""></b></div><div class="">Thus the parser can try to just focus on what's inside the <b class="">#(</b>...<b class="">) or&nbsp;</b><b class="">@(</b>...<b class="">)</b><br class=""></div><div class=""><br class=""></div><div class="gmail_quote"><div dir="ltr" class="">Em dom, 27 de dez de 2015 às 22:27, John McCall via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; escreveu:<br class=""></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">&gt; On Dec 27, 2015, at 4:15 PM, Chris Lattner &lt;<a href="mailto:clattner@apple.com" target="_blank" class="">clattner@apple.com</a>&gt; wrote:<br class="">
&gt;<br class="">
&gt; On Dec 27, 2015, at 4:09 PM, John McCall &lt;<a href="mailto:rjmccall@apple.com" target="_blank" class="">rjmccall@apple.com</a>&gt; wrote:<br class="">
&gt;&gt;&gt; I’m a fan of good error recovery, but I don’t think it is a major concern here for two reasons:<br class="">
&gt;&gt;&gt;<br class="">
&gt;&gt;&gt; 1) The most common case in a method will lack a label, and "thing.foo(_: “ and “thing.foo(:” are both unambiguously a curried reference.<br class="">
&gt;&gt;&gt; 2) A common case of accidentally completing a nullary call (thing.foo() vs thing.foo) will produce a type error.&nbsp; We already produce good QoI for an unapplied function - adding the inverse would be simple.<br class="">
&gt;&gt;&gt;<br class="">
&gt;&gt;&gt; Further, it will be uncommon *in general* to form a curried reference, so error recovery doesn’t have to be perfect in all the edge cases.&nbsp; As with other commenters, if it is at all possible to avoid the extra backticks, I’d really prefer that.<br class="">
&gt;&gt;<br class="">
&gt;&gt; The concern, I think, is that a messed-up normal call might look like a curried reference.<br class="">
&gt;&gt;<br class="">
&gt;&gt; My inclination would be to go the other way: if we get a syntax for this that we like, I think we should use it for *all* curried member references, and reject things like foo.bar in favor of foo.`bar`.&nbsp; The ability to write foo.bar for a method has always struck me as more clever than wise, to be honest.<br class="">
&gt;<br class="">
&gt; If you were to go that far, I’d suggest looking at this as a different version of the “." operator.&nbsp; If you resyntax curried to something else like (just a strawman, intentionally ugly syntax):<br class="">
&gt;<br class="">
&gt;&nbsp; &nbsp; &nbsp; &nbsp;foo.#bar<br class="">
&gt;<br class="">
&gt; Then you’d get a nice property that the plain old dot operator always has to be fully applied.&nbsp; This certainly would be a win for error recovery.&nbsp; Also, if you did this, you wouldn’t need the backticks from doug’s proposal either for things like:<br class="">
&gt;<br class="">
&gt;&nbsp; &nbsp; &nbsp; &nbsp;foo.#bar(param1:param2:)<br class="">
&gt;<br class="">
&gt; either.<br class="">
<br class="">
Right.&nbsp; I really like this effect.<br class="">
<br class="">
I’m not that bothered by requiring the backticks, especially because it generalizes well to non-member function references, which I’m not sure any sort of different-member-access syntax does.<br class="">
<br class="">
John.<br class="">
_______________________________________________<br class="">
swift-evolution mailing list<br class="">
<a href="mailto:swift-evolution@swift.org" target="_blank" class="">swift-evolution@swift.org</a><br class="">
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class="">
</blockquote></div></div>
</div></blockquote></div><br class=""></body></html>