<div dir="ltr">For some protocols we&#39;d like to require top-level (free) functions, e.g. for many math functions such as <font face="monospace, monospace">abs()</font> or <font face="monospace, monospace">sin()</font>. We already do this implicitly for operators. <div><br></div><div><b>Proposal</b></div><div>Allow top-level function/property requirements in protocols, e.g.:</div><div><br></div><div><table class="" style="border-spacing:0px;border-collapse:collapse;color:rgb(51,51,51);font-family:Helvetica,arial,nimbussansl,liberationsans,freesans,clean,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;font-size:13px"><tbody style=""><tr style=""><td id="LC141" class="" style="padding:0px 10px;vertical-align:top;overflow:visible;font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:12px;word-wrap:normal;white-space:pre"><span class="" style="color:rgb(167,29,93)">public</span> <span class="" style="color:rgb(167,29,93)">protocol</span> <span class="" style="color:rgb(0,134,179)">AbsoluteValuable</span> <span class="" style="color:rgb(167,29,93)">:</span> SignedNumber {
  <span class="" style="color:rgb(150,152,150)">/// Returns the absolute value of `x`.
</span><span style="color:rgb(167,29,93)">  @warn_unused_result
</span><span class="" style="color:rgb(167,29,93)">  toplevel</span> <span class="" style="color:rgb(167,29,93)">func</span> <span class="" style="color:rgb(121,93,163)">abs</span>(<span class="" style="color:rgb(121,93,163)">_</span> <span class="">x</span>: <span class="" style="color:rgb(167,29,93)">Self</span>) <span class="" style="color:rgb(167,29,93)">-&gt;</span> Self
}</td></tr></tbody></table><div><br></div><div>We&#39;d probably want to require this for operators. This also opens up syntax if we ever get dynamically dispatched operators.</div><div><p style="margin:0px;font-size:12px;line-height:normal;font-family:Consolas;color:rgb(0,134,179)"><span style="color:rgb(167,29,93)"><br></span></p><table class="" style="border-spacing:0px;border-collapse:collapse;color:rgb(51,51,51);font-family:Helvetica,arial,nimbussansl,liberationsans,freesans,clean,sans-serif,&#39;Apple Color Emoji&#39;,&#39;Segoe UI Emoji&#39;,&#39;Segoe UI Symbol&#39;;font-size:13px"><tbody style=""><tr style=""><td id="LC98" class="" style="padding:0px 10px;vertical-align:top;overflow:visible;font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:12px;word-wrap:normal;white-space:pre"><span class="" style="color:rgb(167,29,93)">public</span> <span class="" style="color:rgb(167,29,93)">protocol</span> SignedNumber <span class="" style="color:rgb(167,29,93)">:</span> <span class="" style="color:rgb(0,134,179)">Comparable</span>, <span class="" style="color:rgb(0,134,179)">IntegerLiteralConvertible</span> {
  <span class="" style="color:rgb(150,152,150)">/// Returns the result of negating `x`.
</span>  <span class="" style="color:rgb(167,29,93)">@warn_unused_result
  toplevel </span><span class="" style="color:rgb(167,29,93)">prefix</span> <span class="" style="color:rgb(167,29,93)">func</span> <span class="" style="color:rgb(121,93,163)">-</span> (x: <span class="" style="color:rgb(167,29,93)">Self</span>) <span class="" style="color:rgb(167,29,93)">-&gt;</span> Self
}</td></tr></tbody></table></div></div><div><div><br></div><div>Currently this is done using the combination of a static method and a top-level generic function on that protocol. As I understand that approach does have some benefits in terms of type-checker performance, though I&#39;m not sure whether that is likely to stay relevant in the future.</div><div><br></div><div><b>Advantages</b></div></div><div><ul><li>Cleaner than current approach (esp. floating point types have tons of top-level functions)</li><li>Makes operators less of a special case</li><li>Opens up syntax for member operators</li><li>Could also apply to top-level properties (esp. useful if we get generic properties, for e.g. π&lt;...&gt;)</li></ul></div></div>