<div dir="ltr">`$$` Doesn&#39;t take another sigil away and shouldn&#39;t be ambiguous since it isn&#39;t used in current syntax.<div><div><br></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jan 20, 2016 at 2:39 PM, John McCall via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</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"><span class=""><div><blockquote type="cite"><div>On Jan 20, 2016, at 9:49 AM, Joe Groff &lt;<a href="mailto:jgroff@apple.com" target="_blank">jgroff@apple.com</a>&gt; wrote:</div><div><div style="word-wrap:break-word"><div><blockquote type="cite"><div>On Jan 20, 2016, at 8:57 AM, Jordan Rose via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:</div><br><div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><blockquote type="cite"><div><br>On Jan 19, 2016, at 20:35 , John McCall via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:</div><br><div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><blockquote type="cite"><div>On Jan 19, 2016, at 7:20 PM, Paul Cantrell via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:</div><br><div><div style="word-wrap:break-word">Surprisingly, this code does not compile:<div><br></div><div><div><div style="margin:0px;font-size:10.5px;line-height:normal;font-family:Menlo"><div style="margin:0px;font-size:10.5px;line-height:normal"><div style="margin:0px;font-size:10.5px;line-height:normal">    <span style="color:rgb(50,62,125)">func</span><span> </span>foo(val:<span> </span><span style="color:rgb(88,126,168)">Int</span>) { }</div><div style="margin:0px;font-size:10.5px;line-height:normal;min-height:12px"><br></div><div style="margin:0px;font-size:10.5px;line-height:normal">   <span> </span><span style="color:rgb(50,62,125)">func</span><span> </span>bar(closure: (<span style="color:rgb(88,126,168)">Int</span>,<span style="color:rgb(88,126,168)">Int</span>) -&gt;<span> </span><span style="color:rgb(88,126,168)">Void</span>) {</div><div style="margin:0px;font-size:10.5px;line-height:normal">        closure(<span style="color:rgb(50,62,125)">0</span>,<span> </span><span style="color:rgb(50,62,125)">1</span>)</div><div style="margin:0px;font-size:10.5px;line-height:normal">    }</div><div style="margin:0px;font-size:10.5px;line-height:normal;min-height:12px"><br></div><div style="margin:0px;font-size:10.5px;line-height:normal">   <span> </span><span style="color:rgb(88,126,168)">bar</span><span> </span>{<span> </span><span style="color:rgb(88,126,168)">foo</span>($0) }      <span> </span><span style="color:rgb(102,139,73)">// compiler error</span></div><div style="margin:0px;font-size:10.5px;line-height:normal">   <span> </span><span style="color:rgb(88,126,168)">bar</span><span> </span>{<span> </span><span style="color:rgb(88,126,168)">foo</span>($1) }      <span> </span><span style="color:rgb(102,139,73)">// just dandy</span></div><div style="margin:0px;font-size:10.5px;line-height:normal">   <span> </span><span style="color:rgb(88,126,168)">bar</span><span> </span>{<span> </span><span style="color:rgb(88,126,168)">foo</span>($0 + $1) } <span> </span><span style="color:rgb(102,139,73)">// also works</span></div><div><span style="color:rgb(102,139,73)"><br></span></div></div></div></div><div>The compiler error is:</div><div><br></div><div>    Cannot convert value of type (Int, Int) to expected argument type Int</div></div><div><br></div><div>It appears that the meaning of <span style="font-family:Menlo;font-size:11px">$0</span> is overloaded: it can refer either to the tuple of all arguments, or to just the first argument. The presence of another placeholder variable (<span style="font-family:Menlo;font-size:11px">$1</span> in the third example) seems to trigger the latter behavior.</div></div></div></blockquote><div><br></div>It’s dumber than that.  The type-checker assumes that the closure has a tuple of arguments ($0, $1, …, $N), where $N is the largest N seen in the closure.  Thus, a two-argument closure falls down if you ignore the second argument.  It’s dumb, and we’ve known about it for a long time; and yet it’s been remarkably annoying to fix, and so we haven’t yet.</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant: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:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">Anyway, it’s a bug and doesn’t need to go through evolution.</div></div></blockquote><br></div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">I wouldn&#39;t go as far as to say it&#39;s a bug. It&#39;s known and occasionally useful for forwarding arguments. (For a while I had it as a fix-it for doing function representation conversions.)</div><div style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant: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:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">I agree that having it always be the first argument is less surprising and probably more generally useful, though.</div></div></blockquote><br></div><div>In the spirit of the Great Argument Simplification to distinguish arguments from tuples, we probably ought to introduce a separate &#39;$*&#39;-like sigil to bind &quot;all arguments&quot; distinct from $0.</div></div></div></blockquote><div><br></div></div></span>Yeah, that makes sense to me.  $_, clearly. :)<div><br></div><div>John.</div></div><br>_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
<br></blockquote></div><br></div>