<div dir="ltr"><b style="font-size:13px;font-family:Menlo">import</b><span style="font-size:13px;font-family:Menlo"> Foo </span><b style="font-size:13px;font-family:Menlo">using</b><span style="font-size:13px;font-family:Menlo"> (bar, Baz, qux, waldo <b>as</b> fred)  <font color="#919191">// a &quot;whitelist import&quot;</font></span><div><b style="font-size:13px;font-family:Menlo">import</b><span style="font-size:13px;font-family:Menlo"> Foo </span><b style="font-size:13px;font-family:Menlo">hiding</b><span style="font-size:13px;font-family:Menlo"> (bar, Baz, qux, waldo <b>as</b> fred) <font color="#919191">// a &quot;blacklist import&quot;</font></span><div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><span style="font-size:13px;font-family:Menlo"><font color="#919191"><br></font></span><br></blockquote>Is nice but `hiding… (waldo as fred)` is confusing. Am I hiding waldo? It is also strange to look in that list for things that I am hiding and things that I am importing. Context switches after the item that I am importing because `as` follows the item in question.<br><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><br></blockquote></div></div><div><div><b style="font-family:Menlo">import</b><span style="font-family:Menlo"> Foo (</span><span style="font-family:Menlo">waldo </span><b style="font-family:Menlo">as</b><span style="font-family:Menlo"> fred</span><span style="font-family:Menlo">) </span><b style="font-family:Menlo">using</b><span style="font-family:Menlo"> (bar, Baz, qux)  <font color="#919191">// a &quot;whitelist import&quot;</font></span></div></div><div><b style="font-size:13px;font-family:Menlo">import</b><span style="font-size:13px;font-family:Menlo"> Foo (</span><span style="font-size:13px;font-family:Menlo">waldo </span><b style="font-size:13px;font-family:Menlo">as</b><span style="font-size:13px;font-family:Menlo"> fred</span><span style="font-size:13px;font-family:Menlo">) </span><b style="font-size:13px;font-family:Menlo">hiding</b><span style="font-size:13px;font-family:Menlo"> (bar, Baz, qux) <font color="#919191">// a &quot;blacklist import&quot;</font></span><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><br></blockquote>`using` didn&#39;t actually need the syntax change but maintaining one consistent form might be worth it. If not, `import Foo using (bar, Baz, waldo as fred)` is fine. <br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Dec 27, 2015 at 7:44 AM, Pyry Jahkola 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"><div><span class=""><blockquote type="cite"><div>On 27 Dec 2015, at 07:12, Developer via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:</div><br><div><div>Therefore, I propose the introduction of 3 agda-esque operations for imports to replace the usual `import {func|typealias|struct|class|enum|etc.}` syntax:<br><br><span style="white-space:pre-wrap">        </span>• import Foo using (bar, Baz, qux, corge, …)<br><span style="white-space:pre-wrap">        </span>• import Foo hiding (bar, baz, qux, corge, …)<br><span style="white-space:pre-wrap">        </span>• import Foo renaming (grault to garply, waldo to fred, …)<br></div></div></blockquote><div><br></div></span><div>+1, but why not just…?</div><div><br></div><div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div><div><font color="#00afcd"><b style="font-family:Menlo">import</b><span style="font-family:Menlo"> Foo </span><b style="font-family:Menlo">using</b></font><span style="font-family:Menlo"><font color="#00afcd"> (bar, Baz, qux, waldo <b>as</b> fred)</font>  <font color="#919191">// a &quot;whitelist import&quot;</font></span></div></div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div><div><font color="#00afcd"><b style="font-family:Menlo">import</b><span style="font-family:Menlo"> Foo </span><b style="font-family:Menlo">hiding</b></font><span style="font-family:Menlo"><font color="#00afcd"> (bar, Baz, qux, waldo <b>as</b> fred)</font> <font color="#919191">// a &quot;blacklist import&quot;</font></span></div></div></div></blockquote></div><div><br></div><div>I&#39;ve been able to work around identifier conflicts with the present <b><font face="Menlo">import</font></b> syntax but it gets clumsy with larger modules. I think both <b style="font-family:Menlo">import</b><span style="font-family:Menlo">-</span><b style="font-family:Menlo">using</b> and <b style="font-family:Menlo">import</b><span style="font-family:Menlo">-</span><b style="font-family:Menlo">hiding</b> would be very welcome in Swift, but the third notation made me double check its semantics from The Agda Wiki. <a href="http://wiki.portal.chalmers.se/agda/pmwiki.php?n=ReferenceManual.Modules#mods" target="_blank">Turns out</a> the <font face="Menlo"><b>renaming</b> (...)</font> syntax is actually an extension to the other two and is often used as a part of the one or the other:</div></div><div><div><br></div></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><div><b style="font-family:Menlo">import</b><span style="font-family:Menlo"> Foo </span><b style="font-family:Menlo">using</b><span style="font-family:Menlo"> (bar, Baz, qux) <font color="#ff2600"><b>renaming</b> (waldo <b>to</b> fred)</font></span></div><div><b style="font-family:Menlo">import</b><span style="font-family:Menlo"> Foo </span><b style="font-family:Menlo">hiding</b><span style="font-family:Menlo"> (bar, Baz, qux) <font color="#ff2600"><b>renaming</b> (waldo <b>to</b> fred)</font></span></div></div></blockquote><div><div><br></div><div>Why not do without <font face="Menlo"><b>renaming</b></font>? Just allow both <b style="font-family:Menlo">import</b><span style="font-family:Menlo">-</span><b style="font-family:Menlo">using</b> and <b style="font-family:Menlo">import</b><span style="font-family:Menlo">-</span><b style="font-family:Menlo">hiding</b> to optionally <i>rename</i> imported identifiers. Further, while these keywords can and should be made context-specific, I think it&#39;s simplest to reuse &quot;<b><font face="Menlo">as</font></b>&quot; as the associating keyword.</div><div><br></div><div>That would lead us to the <b>proposed syntax</b>:</div><div><br></div></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><div><div><b style="font-family:Menlo">import</b><span style="font-family:Menlo"> Foo </span><b style="font-family:Menlo">using</b><span style="font-family:Menlo"> (bar, Baz, qux, waldo <b>as</b> fred)  <font color="#919191">// a &quot;whitelist import&quot;</font></span></div></div></div></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><div><div><b style="font-family:Menlo">import</b><span style="font-family:Menlo"> Foo </span><b style="font-family:Menlo">hiding</b><span style="font-family:Menlo"> (bar, Baz, qux, waldo <b>as</b> fred) <font color="#919191">// a &quot;blacklist import&quot;</font></span></div></div></div></blockquote><div><div><br></div><div>where the tuple-like parentheses enclose a potentially empty list of identifiers or &quot;identifier <b><font face="Menlo">as</font></b> identifier&quot; mappings. The examples below should clarify the meaning and intended use of these two statements.</div><div><br></div><div><span class=""><div><blockquote type="cite"><span></span>Again, it should be obvious by uniqueness of identifiers what each one is referencing, so qualification of each identifier is unnecessary.</blockquote></div><div><br></div></span><div>Agreed. In addition, extending the import statement to class/enum/struct members doesn&#39;t make sense to me. Those don&#39;t conflict with the global scope at all.</div><div><br></div></div><div>— Pyry Jahkola</div><div><br></div><div><br></div><div>P.S. If this turns into a formal proposal, should we also address how imported operators should be dealt with? Can operators be selectively imported, hidden, or renamed? If renaming is made possible, we should be explicit on how the renamed operator inherits its associativity and precedence from the original one.</div><div><br></div><div><br></div><div><b><font size="5">Examples</font></b></div><div><br></div></div><div>Suppose the module <font face="Menlo">Foo</font> contains the following identifiers:<br><br><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><span style="color:rgb(145,145,145);font-family:Menlo">// module Foo:<br></span><span style="color:rgb(145,145,145);font-family:Menlo">// - bar, Baz, qux, waldo</span></blockquote><br>The &quot;import-all&quot; remains as it is in Swift 2:<br><font face="Menlo"><b><br></b></font><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><b style="font-family:Menlo">import</b><span style="font-family:Menlo"> Foo</span><font face="Menlo"><br></font><span style="font-family:Menlo"><br></span></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><span style="font-family:Menlo">_ = (bar, Baz.self, qux, waldo) </span><font color="#919191" style="font-family:Menlo">// All identifiers can be unqualified.</font></blockquote><font face="Menlo"><br></font>The &quot;import-all&quot; is synonymous with the longer &quot;hide-nothing&quot;:<br><font face="Menlo"><b><br></b></font><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><b style="font-family:Menlo">import</b><span style="font-family:Menlo"> Foo </span><b style="font-family:Menlo">hiding</b><span style="font-family:Menlo"> ()</span></blockquote><font face="Menlo"><br></font>To hide or rename an identifier, fill in the parentheses:<br><font face="Menlo"><b><br></b></font><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><b style="font-family:Menlo">import</b><span style="font-family:Menlo"> Foo </span><b style="font-family:Menlo">hiding</b><span style="font-family:Menlo"> (Baz, waldo </span><b style="font-family:Menlo">as</b><span style="font-family:Menlo"> fred)</span><font face="Menlo"><br></font><span style="font-family:Menlo"><br></span></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><span style="font-family:Menlo">_ = (bar, qux, fred)            </span><font color="#919191" style="font-family:Menlo">// These names can be unqualified.<br></font><span style="font-family:Menlo">_ = (Foo.Baz.self, Foo.waldo)   </span><font color="#919191" style="font-family:Menlo">// These names must be qualified.<br></font><span style="font-family:Menlo">_ = </span><font color="#ff2600" style="font-family:Menlo">Foo.fred</font><span style="font-family:Menlo">                    </span><font color="#919191" style="font-family:Menlo">// Compiler error!</font></blockquote><font face="Menlo"><br></font>To import selectively, potentially renaming identifiers, use the <font face="Menlo"><b>import</b>-<b>using</b></font> syntax:<br><font face="Menlo"><b><br></b></font><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><b style="font-family:Menlo">import</b><span style="font-family:Menlo"> Foo </span><b style="font-family:Menlo">using</b><span style="font-family:Menlo"> (</span><span style="font-family:Menlo">Baz </span><b style="font-family:Menlo">as</b><span style="font-family:Menlo"> FooBaz, </span><span style="font-family:Menlo">qux, waldo </span><b style="font-family:Menlo">as</b><span style="font-family:Menlo"> fred</span><span style="font-family:Menlo">)</span><font face="Menlo"><br></font><span style="font-family:Menlo"><br></span></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><span style="font-family:Menlo">_ = (FooBaz.self, qux, fred)    </span><font color="#919191" style="font-family:Menlo">// These names can be unqualified.<br></font><span style="font-family:Menlo">_ = (Foo.Baz.self, Foo.bar)     </span><font color="#919191" style="font-family:Menlo">// These names must be qualified.</font></blockquote><font face="Menlo"><br></font>Finally, it&#39;s possible to require qualified use of the Foo module:<br><font face="Menlo"><br></font><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><b style="font-family:Menlo">import</b><span style="font-family:Menlo"> Foo </span><b style="font-family:Menlo">using</b><span style="font-family:Menlo"> ()</span><font face="Menlo"><br></font><span style="font-family:Menlo"><br></span></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><span style="font-family:Menlo">_ = (Foo.bar, Foo.Baz.self, Foo.qux, Foo.waldo) </span><font color="#919191" style="font-family:Menlo">// OK.</font><div><div><font face="Menlo">_ = <font color="#ff2600">(bar, Baz.self, qux, waldo)</font> <font color="#919191">// Compiler error x 4!</font></font></div></div></blockquote></div><span></span><div><div><br></div><div>End.</div></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>