<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 class="">Corrections, additions below…</div><br class=""><div><blockquote type="cite" class=""><div class="">Let's consider the following declarations:</div><div class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""><br class=""></div><div class=""><div class=""><span class="" style="font-family: Menlo; font-size: 11px;">&nbsp; &nbsp;&nbsp;</span><b class="" style="font-family: Menlo; font-size: 11px;">class</b><span class="" style="font-family: Menlo; font-size: 11px;">&nbsp;Bar {</span></div></div><div class=""><div class=""><span style="font-family: Menlo; font-size: 11px;" class="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><b style="font-family: Menlo; font-size: 11px;" class="">func</b><span style="font-family: Menlo; font-size: 11px;" class="">&nbsp;baz() &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><span style="color: rgb(145, 145, 145); font-family: Menlo; font-size: 11px;" class="">// #8 Method named '</span><b style="color: rgb(145, 145, 145); font-family: Menlo; font-size: 11px;" class="">Bar.baz(_)</b><span style="color: rgb(145, 145, 145); font-family: Menlo; font-size: 11px;" class="">' with type '<b class="">Bar -&gt; () -&gt; ()</b>'.</span></div><div class=""><span style="font-family: Menlo; font-size: 11px;" class="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><b style="font-family: Menlo; font-size: 11px;" class="">func</b><span style="font-family: Menlo; font-size: 11px;" class="">&nbsp;baz(x y: Int) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><span style="color: rgb(145, 145, 145); font-family: Menlo; font-size: 11px;" class="">// #9 Method named '</span><b style="color: rgb(145, 145, 145); font-family: Menlo; font-size: 11px;" class="">Bar.baz(x:)</b><span style="color: rgb(145, 145, 145); font-family: Menlo; font-size: 11px;" class="">' with type '<b class="">Bar -&gt; Int -&gt; ()</b>'.</span></div><div class=""><span style="font-size: 11px; font-family: Menlo;" class="">&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="font-size: 11px; font-family: Menlo;" class="">&nbsp;</span><b style="font-size: 11px; font-family: Menlo;" class="">static func</b><span style="font-size: 11px; font-family: Menlo;" class="">&nbsp;</span><span style="font-size: 11px; font-family: Menlo;" class="">baz(x: Int = 0) &nbsp;</span><span style="color: rgb(145, 145, 145); font-family: Menlo; font-size: 11px;" class="">// #10 Static method named '</span><b style="color: rgb(145, 145, 145); font-family: Menlo; font-size: 11px;" class="">Bar.Self.baz(x:)</b><span style="color: rgb(145, 145, 145); font-family: Menlo; font-size: 11px;" class="">' with type '<b class="">Int -&gt; ()</b>'.</span></div><div class=""><span style="font-family: Menlo; font-size: 11px;" class="">&nbsp; &nbsp; }</span></div></div><div class=""><span style="font-family: Menlo; font-size: 11px;" class="">&nbsp; &nbsp;&nbsp;</span><span class="" style="color: rgb(145, 145, 145); font-family: Menlo; font-size: 11px;">// ...</span></div><div class=""><span style="font-family: Menlo; font-size: 11px;" class="">&nbsp; &nbsp; <b class="">let</b> bar = Bar()</span></div><div class=""><font face="Menlo" class=""><span style="font-size: 11px;" class="">&nbsp; &nbsp; </span></font><font color="#ff2600" face="Menlo" style="font-size: 11px;" class=""><b class="">let</b> f10 = bar.baz</font><font face="Menlo" class=""><span style="font-size: 11px;" class=""> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span></font><span style="color: rgb(145, 145, 145); font-family: Menlo; font-size: 11px;" class="">// <b class="">error:</b> not a function reference, did you mean 'bar.baz(_)' or 'bar.baz(x:)'?</span></div><div class=""><div class=""><span style="font-family: Menlo; font-size: 11px;" class="">&nbsp; &nbsp; <b class="">let</b> f11 = bar.baz(_) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><span style="color: rgb(145, 145, 145); font-family: Menlo; font-size: 11px;" class="">// #18 Function synonymous to the closure '{ bar.baz() }' with type '<b class="">() -&gt; ()</b>'.</span></div></div><div class=""><div class=""><span style="font-family: Menlo; font-size: 11px;" class="">&nbsp; &nbsp; <b class="">let</b> f12 = bar.baz(x:) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: rgb(145, 145, 145); font-family: Menlo; font-size: 11px;" class="">// #19 Function synonymous to the closure '{ bar.baz(x: $0) }' with type '<b class="">Int -&gt; ()</b>'.</span></div></div><div class=""><font face="Menlo" class=""><span style="font-size: 11px;" class="">&nbsp; &nbsp; let f13 = Bar.Self.baz(x:) &nbsp; &nbsp; &nbsp; </span></font><font color="#919191" face="Menlo" style="font-size: 11px;" class="">// #20 Function synonymous to the closure '{ Bar.baz(x: $0) }' with type '</font><b style="color: rgb(145, 145, 145); font-family: Menlo; font-size: 11px;" class="">Int -&gt; ()</b><span style="color: rgb(145, 145, 145); font-family: Menlo; font-size: 11px;" class="">'.</span></div><div class=""><font face="Menlo" class=""><span style="font-size: 11px;" class="">&nbsp; &nbsp; let f14 = Bar.Self.baz(_) &nbsp; &nbsp; &nbsp; &nbsp;</span></font><font color="#919191" face="Menlo" style="font-size: 11px;" class="">// #21 Function synonymous to the closure '{ Bar.baz() }' with type '<b class="">() -&gt; ()</b>'.</font></div></div></div></blockquote><div><br class=""></div><div>(…)</div><br class=""><blockquote type="cite" class=""><div class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">C2: Extend&nbsp;<a href="https://github.com/apple/swift-evolution/blob/master/proposals/0021-generalized-naming.md" class="">SE-0021</a>&nbsp;by <b class="">removing</b>&nbsp;the ambiguity between instance and type members. From now on, `Bar.baz(_)`&nbsp;</div></div></div></blockquote><blockquote type="cite" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class=""></div></div></blockquote><div><br class=""></div><div>That was meant to read:</div><div><br class=""></div><div></div><div>"(…) From now on, `<font face="Menlo" class=""><span style="font-size: 11px;" class="">Bar.baz(_)</span></font>` unambiguously refers to the <i class="">instance</i> method named `<font face="Menlo" class=""><span style="font-size: 11px;" class="">baz(_)</span></font>`. To refer to the static or class method named `<font face="Menlo" class=""><span style="font-size: 11px;" class="">baz(_)</span></font>`, put the keyword `<font face="Menlo" class=""><span style="font-size: 11px;" class="">.<b class="">Self</b></span></font>` between the type and the base name. This syntax should align with the outcome of&nbsp;<a href="https://github.com/apple/swift-evolution/blob/master/proposals/0068-universal-self.md" class="">SE-0068</a>&nbsp;such the keyword resembles the static method call `thing<font face="Menlo" class=""><span style="font-size: 11px;" class="">.<b class="">Self</b>.baz()</span></font>` of a `<font face="Menlo" class=""><span style="font-size: 11px;" class="">thing</span></font>` of type `<font face="Menlo" class=""><span style="font-size: 11px;" class="">Bar</span></font>`."</div><div><br class=""></div><div>(Alternatives considered: (1) the use of `Bar.self.baz(_)` with lower-case `<font face="Menlo" class=""><span style="font-size: 11px;" class="">self</span></font>`, which is probably more confusing; and (2) inverting the choice and making the instance method require a keyword instead, which would harm readability as it's usually the instance method that you'd refer to and not the static one.)</div><br class=""><blockquote type="cite" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">C6: <b class="">Clarify</b>&nbsp;that by using the base name `<font face="Menlo" class=""><span style="font-size: 11px;" class="">foo</span></font>` for a function, the same scope cannot define a variable with the name `<font face="Menlo" class=""><span style="font-size: 11px;" class="">foo</span></font>`. And, vice versa, in a scope that defines a variable named `<font face="Menlo" class=""><span style="font-size: 11px;" class="">foo</span></font>`, there can be no function `<font face="Menlo" class=""><span style="font-size: 11px;" class="">foo(...)</span></font>` defined at the same scope level.</div><div class=""></div></div></blockquote><div><br class=""></div><div>This doesn't prevent shadowing of course. E.g. An inner scope with a variable named `<font face="Menlo" class=""><span style="font-size: 11px;" class="">foo</span></font>` would shadow all functions named `<font face="Menlo" class=""><span style="font-size: 11px;" class="">foo(...)</span></font>` of an enclosing scope.</div><br class=""><blockquote type="cite" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">The implications are:</div><div class=""><br class=""></div><div class="">I1: The use of a function's base name to refer to a function will cease to work. It has, however, been buggy up to this date. Consider the following:</div><div class=""><br class=""></div><div class=""><div class=""><font face="Menlo" class=""><span style="font-size: 11px;" class="">&nbsp; &nbsp;&nbsp;<b class="">let</b>&nbsp;f = [Int].prefix&nbsp;</span><font color="#919191" style="font-size: 11px;" class="">// '[Int] -&gt; Int -&gt; ArraySlice&lt;Int&gt;'</font></font></div><div class=""><font face="Menlo" class=""><font color="#919191" style="font-size: 11px;" class=""><br class=""></font></font></div><div class=""><font face="Menlo" class=""><span style="font-size: 11px;" class="">&nbsp; &nbsp;&nbsp;<b class="">let</b>&nbsp;g1 = [Int].dropFirst&nbsp;</span><font color="#919191" style="font-size: 11px;" class="">// Inexplicably chooses the '[Int] -&gt; Int -&gt; ArraySlice&lt;Int&gt;' overload!</font></font></div><div class=""><font face="Menlo" class=""><span style="font-size: 11px;" class="">&nbsp; &nbsp;&nbsp;<b class="">let</b>&nbsp;g2 = [Int].dropFirst&nbsp;<b class="">as</b>&nbsp;[Int] -&gt; () -&gt; ArraySlice&lt;Int&gt;&nbsp;</span></font><font color="#919191" face="Menlo" style="font-size: 11px;" class="">// Disambiguate</font><span style="color: rgb(145, 145, 145); font-family: Menlo; font-size: 11px;" class="">&nbsp;</span><span style="color: rgb(145, 145, 145); font-family: Menlo; font-size: 11px;" class="">by type</span><span style="font-size: 11px; color: rgb(145, 145, 145); font-family: Menlo;" class="">.</span></div><div class=""><font color="#919191" face="Menlo" style="font-size: 11px;" class=""><br class=""></font></div><div class=""><span style="font-family: Menlo; font-size: 11px;" class="">&nbsp; &nbsp;&nbsp;<b class="">let</b>&nbsp;h1 = [Int].sorted&nbsp;</span><font color="#919191" style="font-family: Menlo; font-size: 11px;" class="">// Chooses the '[Int] -&gt; () -&gt; [Int]' overload, unlike 'dropFirst' above.</font></div><div class=""><font face="Menlo" class=""><span style="font-size: 11px;" class="">&nbsp; &nbsp;&nbsp;</span></font><b style="font-family: Menlo; font-size: 11px;" class="">let</b><font face="Menlo" class=""><span style="font-size: 11px;" class="">&nbsp;h2 = [Int].sorted&nbsp;<b class="">as</b>&nbsp;[Int] -&gt; ((Int, Int) -&gt; Bool) -&gt; [Int]&nbsp;</span></font><font color="#919191" face="Menlo" style="font-size: 11px;" class="">// Disambiguate by type.</font></div></div></div></blockquote><div><br class=""></div><div>By the way, the same also happens with the current Swift (both 2.2 and 3 master) when referring to the partially applied instance method like so:</div><div><br class=""></div><div><div><div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class=""><div class=""><span class="" style="font-family: Menlo; font-size: 11px;">&nbsp; &nbsp;&nbsp;<b class="">let</b>&nbsp;xs = [1,3,2]</span></div><div class=""><span class="" style="font-family: Menlo; font-size: 11px;">&nbsp; &nbsp;&nbsp;<b class="">let</b>&nbsp;g = xs.dropFirst&nbsp;</span><font color="#919191" class="" style="font-family: Menlo; font-size: 11px;">// Chooses the 'Int -&gt; ArraySlice&lt;Int&gt;' overload.</font></div><div class=""><span class="" style="font-family: Menlo; font-size: 11px;">&nbsp; &nbsp;&nbsp;<b class="">let</b>&nbsp;h = xs.sorted &nbsp; &nbsp;</span><font color="#919191" class="" style="font-family: Menlo; font-size: 11px;">// Chooses the '() -&gt; [Int]' overload, unlike 'dropFirst' above.</font></div><div class=""><br class=""></div></div></div></div></div><blockquote type="cite" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">I3: Function argument lists are no longer that special and there's no need to notate single-n-tuple argument lists separately from n-argument functions, i.e.&nbsp;<b class=""><a href="https://github.com/apple/swift-evolution/blob/master/proposals/0066-standardize-function-type-syntax.md" class="">SE-0066</a>&nbsp;is not really needed anymore</b>. The new intuition here is that <b class="">it's the function's name that defines how a function can be called</b>, not its type.</div><div class=""></div></div></blockquote><div><br class=""></div><div>In yet other words, <b class="">we don't have to capture the arity of a function in the type system at all</b>—it's enough to carry that information around in the function name.</div><br class=""></div><div>~&gt;</div><div><br class=""></div><div>Finally, this was a fairly technical pitch but a pitch anyway. Any ideas pro or against?</div><br class=""><div class="">— Pyry</div><div class=""><br class=""></div></body></html>