<div dir="ltr">I think `#location` (or similar) as a tuple is much nicer than having several `___SOMETHING___`s. I think a solution that doesn&#39;t exploit default arguments is better, especially if it can reduce the number of reserved words (not that I expect anyone to accidentally call something `__LINE__`.<div><br></div><div>I think Chris&#39; point about accessing fields on the default argument needs to be addressed before a tuple is a workable solution.</div><div><br></div><div>Another reason to not use a tuple (yet) is that the labels on the tuple are insufficient to distinguish it, and/or Swift doesn&#39;t yet let you add an extension to a tuple type.</div><div><br></div><div>This is a contrived example (I skipped part of the tuple for brevity):</div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span style="color:rgb(187,44,162)">typealias</span> SourceLocation = (line: <span style="color:rgb(112,61,170)">Int</span>, file: <span style="color:rgb(112,61,170)">String</span>)</p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span style="color:rgb(187,44,162)">typealias</span> RepeatConfig   = (count: <span style="color:rgb(112,61,170)">Int</span>, string: <span style="color:rgb(112,61,170)">String</span>)</p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span style="color:rgb(187,44,162)">func</span> print(location: <span style="color:rgb(79,129,135)">SourceLocation</span>) {</p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">    <span style="color:rgb(61,29,129)">print</span>(<span style="color:rgb(209,47,27)">&quot;</span>\<span style="color:rgb(209,47,27)">(</span>location.file<span style="color:rgb(209,47,27)">):</span>\<span style="color:rgb(209,47,27)">(</span>location.line<span style="color:rgb(209,47,27)">)&quot;</span>)</p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">}</p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo"><span style="color:rgb(187,44,162)">func</span> print(config: <span style="color:rgb(79,129,135)">RepeatConfig</span>) {</p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">    <span style="color:rgb(187,44,162)">for</span> <span style="color:rgb(187,44,162)">_</span> <span style="color:rgb(187,44,162)">in</span> <span style="color:rgb(39,42,216)">1</span> ... config.count { <span style="color:rgb(61,29,129)">print</span>(config.string) }</p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">






</p><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">}</p></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">
<p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(209,47,27)"><span style="color:rgb(49,89,93)">print</span><span style="color:rgb(0,0,0)">((</span><span style="color:rgb(39,42,216)">1</span><span style="color:rgb(0,0,0)">,</span>&quot;this is ambiguous&quot;<span style="color:rgb(0,0,0)">))</span></p></blockquote><div><br></div>This results in a compile-time error:<blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(79,129,135)"><span style="color:rgb(187,44,162)">extension</span><span style="color:rgb(0,0,0)"> </span>SourceLocation<span style="color:rgb(0,0,0)"> {</span></p></div><div><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">    <span style="color:rgb(187,44,162)">var</span> stringForError: <span style="color:rgb(79,129,135)">String</span> {</p></div><div><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">        <span style="color:rgb(187,44,162)">return</span> <span style="color:rgb(209,47,27)">&quot;</span>\<span style="color:rgb(209,47,27)">(</span><span style="color:rgb(187,44,162)">self</span>.file<span style="color:rgb(209,47,27)">):</span>\<span style="color:rgb(209,47,27)">(</span><span style="color:rgb(187,44,162)">self</span>.line<span style="color:rgb(209,47,27)">)&quot;</span></p></div><div><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">    }</p></div><div><p style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo">}</p></div></blockquote><span style="font-size:11px"><div style="font-family:Menlo"><font face="Menlo"><span style="font-size:11px"><br></span></font></div></span>Error:<br><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><b style="font-family:Menlo;font-size:11px">non-nominal type &#39;SourceLocation&#39; (aka &#39;(line: Int, file: String)&#39;) cannot be extended</b></blockquote><div><div><div><br></div></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Jan 23, 2016 at 11:31 AM, Chris Lattner 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"><span class=""><br>
&gt; On Jan 22, 2016, at 4:21 PM, David Sweeris via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt; It&#39;s only a &quot;compiler-known type&quot; if it&#39;s defined that way. What&#39;s wrong with just a regular tuple?<br>
&gt; #location = (path: __FILE__, line: __LINE__, column: __COLUMN__, function: __FUNCTION__)<br>
<br>
</span>This would make sense to me.  One complexity here is that you’d want to use:<br>
<br>
func f(a : Int = #location.line) {}<br>
<br>
and our default argument model doesn’t support that.  A default argument is either an expression, or one of these magic __LINE__ indicators.  They aren’t really first-class values.<br>
<br>
-Chris<br>
<div class="HOEnZb"><div class="h5"><br>
&gt;<br>
&gt; - Dave Sweeris<br>
&gt;<br>
&gt;&gt; On Jan 22, 2016, at 11:42, Jordan Rose via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;&gt; On Jan 21, 2016, at 21:44, Joe Groff via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; On Jan 21, 2016, at 9:25 PM, Erica Sadun via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; Okay, you know this was coming: let&#39;s Groff this thing.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; How about #(line) where you can decouple the specific compiler implementation bits from the keyword bits without hardcoding support, enabling implementation of, for example, #(runcible) for future Swift compiler substitution logic.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; If you&#39;re going to bring me into it…I would prefer coalescing all these __FILE__, __LINE__, etc. things into one #sourceLocation structure. If you want one source-location-related thing, you tend to want the others, and you also want to be able to forward the source location info easily through the depths of your assertion/logging framework.<br>
&gt;&gt;<br>
&gt;&gt; The downside is that this becomes Yet Another Compiler-Known Type and Yet Another Thing In the Standard Library. All the current fields are string literals and integer literals.<br>
&gt;&gt;<br>
&gt;&gt; Jordan<br>
&gt;&gt; _______________________________________________<br>
&gt;&gt; swift-evolution mailing list<br>
&gt;&gt; <a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
&gt;&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
&gt; _______________________________________________<br>
&gt; swift-evolution mailing list<br>
&gt; <a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
&gt; <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>
_______________________________________________<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>
</div></div></blockquote></div><br></div>