<div dir="ltr"><div>Evolutioniers,</div><div><br></div><div><b>Compound name syntax</b> — <font face="monospace, monospace">foo(_:)</font>, <font face="monospace, monospace">foo(bar:)</font>, <font face="monospace, monospace">foo(bar:baz:)</font> — is used to disambiguate references to functions. (You might&#39;ve used it inside a #selector expression.) But there&#39;s currently no compound name for a function with no arguments.</div><div><br></div><div><div><font face="monospace, monospace">    func foo() {}  // no compound syntax for this one :(</font></div><div><font face="monospace, monospace">    func foo(_ bar: Int) {}  // foo(_:)</font></div><div><font face="monospace, monospace">    func foo(bar: Int) {}  // foo(bar:)</font></div><div><font face="monospace, monospace">    func foo(bar: String, baz: Double) {}  // foo(bar:baz:)</font></div></div><div><br></div><div>Given these four functions, only the first one has no compound name syntax. And the simple reference &quot;<font face="monospace, monospace">let myfn = foo</font>&quot; is ambiguous because it could refer to any of the four. A workaround is to specify a contextual type, e.g. &quot;<font face="monospace, monospace">let myfn = foo as () -&gt; Void</font>&quot;.</div><div><br></div><div>I filed <a href="https://bugs.swift.org/browse/SR-3550">SR-3550</a> for this a while ago, and there was some discussion in JIRA about it. I&#39;d like to continue exploring solutions here and then write up a formal proposal.</div><div><br></div><div>To kick off the discussion, <b>I&#39;d like to propose <font face="monospace, monospace">foo(:)</font> for nullary functions.</b></div><div><br></div><div>Advantages:</div><div>- the colon marks a clear similarity to the <font face="monospace, monospace">foo(bar:)</font> form when argument labels are present.</div><div>- cutely parallels the empty dictionary literal, <font face="monospace, monospace">[:]</font>.</div><div><br></div><div>Disadvantages:</div><div>- violates intuition about one-colon-per-argument.</div><div>- the parallel between <font face="monospace, monospace">#selector(foo(:))</font> and <font face="monospace, monospace">@selector(foo)</font> is not quite as obvious as between <font face="monospace, monospace">#selector(foo(_:))</font> and <font face="monospace, monospace">@selector(foo:)</font>.</div><div><br></div><div><br></div><div>For the sake of discussion, another option would be <font face="monospace, monospace"><b>foo(_)</b></font>. This was my original choice, and I like that the number of colons matches the number of parameters. However, it&#39;s a little less obvious as a function reference. It would preclude _ from acting as an actual identifier, and might conflict with pattern-matching syntax (although it appears functions can&#39;t be compared with ~= anyway).</div><div><br></div><div><div><br></div><div>Looking forward to everyone&#39;s bikeshed color ideas,<br clear="all"><div><div class="gmail_signature"><div dir="ltr"><div>Jacob<br></div></div></div></div>
</div></div></div>