<div dir="ltr">No I am proposing 1st class values via the name mangling. But I made a mistake in the code posted - cut and past error from an earlier playground - sorry. Which almost certainly confused you.<div><br></div><div>Anywhere `<span style="font-family:Helvetica;font-size:12px">&lt;T&gt;(T) throws -&gt; T where T: Numeric` appears it is replaced by `</span><font face="Helvetica"><span style="font-size:12px">_Function1__T1__T1__T1__E__Numeric&lt;T&gt;` and the compiler makes the struct once for each concrete T globally. The global function is:</span></font></div><div><font face="Helvetica"><span style="font-size:12px"><br></span></font></div><div><font face="Helvetica"><span style="font-size:12px">    struct _Function1__T1__T1__T1__E__Numeric&lt;T&gt; where T: Numeric { // Mangled name</span></font></div><div><font face="Helvetica"><span style="font-size:12px">        let call: (T) throws -&gt; T</span></font></div><div><font face="Helvetica"><span style="font-size:12px">        init(_ call: @escaping (T) throws -&gt; T) { self.call = call }</span></font></div><div><font face="Helvetica"><span style="font-size:12px">    }</span></font></div><div><font face="Helvetica"><span style="font-size:12px"><br></span></font></div><div><font face="Helvetica"><span style="font-size:12px">When the user writes:</span></font></div><div><font face="Helvetica"><span style="font-size:12px"><br></span></font></div><div><font face="Helvetica"><span style="font-size:12px">    let increment: &lt;T&gt;(T) throws -&gt; T where T: Numeric = { $0 + 1 }</span></font></div><div><font face="Helvetica"><span style="font-size:12px">    increment(1) // 2</span></font></div><div><font face="Helvetica"><span style="font-size:12px">    increment(1.1) // 2.1</span></font></div><div><font face="Helvetica"><span style="font-size:12px"><br></span></font></div><div><font face="Helvetica"><span style="font-size:12px">Compiler issues global struct as above. Then:</span></font></div><div><font face="Helvetica"><span style="font-size:12px"><br></span></font></div><div><font face="Helvetica"><span style="font-size:12px">    let _int_increment = _Function1__T1__T1__T1__E__Numeric&lt;Int&gt;({ $0 + 1 })</span></font></div><div><font face="Helvetica"><span style="font-size:12px">    try _int_increment.call(1) // 2</span></font></div><div><font face="Helvetica"><span style="font-size:12px">    let _double_increment = _Function1__T1__T1__T1__E__Numeric&lt;Double&gt;({ $0 + 1 })</span></font></div><div><font face="Helvetica"><span style="font-size:12px">    try _double_increment.call(1.1) // 2.1</span></font></div><div><br></div><div><font face="Helvetica"><span style="font-size:12px">The more restrictive form that you suggest (I think this is what you mean anyway) of only allowed locally, not globally, is easier to name mangle, you just need a unique name, nothing about the name needs to be canonical. This would be similar to local functions at present and would be useful (though I am not sure how many local *generic* functions there are).</span></font></div><div><font face="Helvetica"><span style="font-size:12px"><br></span></font></div></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature" data-smartmail="gmail_signature">  -- Howard.<br></div></div>
<br><div class="gmail_quote">On 17 November 2017 at 10:47, Slava Pestov <span dir="ltr">&lt;<a href="mailto:spestov@apple.com" target="_blank">spestov@apple.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word;line-break:after-white-space"><br><div><br><blockquote type="cite"><div>On Nov 16, 2017, at 3:07 PM, Howard Lovatt via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:</div><br class="m_-5744858107293221082Apple-interchange-newline"><div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">Where I am proposing a change is that if a closure with generic arguments is encountered it is transformed into the equivalent struct and the struct is typed as it currently is (or if there is a better implementation something equivalent to this), therefore zero change to the type system.</div></div></blockquote><div><br></div>Since we already have local functions that can capture values and be generic, there’s no need to implement a new mechanism for name mangling or handling of captures.</div><div><br><blockquote type="cite"><div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><br></div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">The changes proposed are a transformation into a struct and name mangling, e.g.:</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><br></div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><div>    let increment: &lt;T&gt;(T) throws -&gt; T where T: Numeric = { $0 + 1 }</div></div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><div>    let increment = { &lt;T&gt;(n: T) throws -&gt; T where T: Numeric in n + 1 }</div></div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><div>    let increment: &lt;T&gt;(T) throws -&gt; T where T: Numeric = { &lt;T&gt;(n: T) throws -&gt; T where T: Numeric in n + 1 }</div></div></div></blockquote></div><br><div>It sounds like what you’re proposing is essentially a new surface syntax for local functions — since a generic closure would not be a first class value, it could not appear anywhere except for the right hand side of a let binding, right?</div><span class="HOEnZb"><font color="#888888"><div><br></div><div>Slava</div></font></span></div></blockquote></div><br></div>