<div dir="ltr">Having watched this conversation from the sidelines, I just wanted to chime in from a more distant view:<div><br></div><div>Originally, I thought this proposal was very nice because it made a good argument as to why enum cases would benefit from being function-like. It follows naturally that form should follow function, and therefore it&#39;s hard to argue that the syntax shouldn&#39;t be &quot;rectified.&quot;</div><div><br></div><div>But, given the latest discussions, it seems that there&#39;s a bunch of round-peg-square-hole efforts going on precisely because enum cases *aren&#39;t* very function-like in some key respects:</div><div><br></div><div>- John McCall gives a cogent reason why parameter names and argument labels would be inconsistently used if they are put to the purpose that some have proposed here for enum cases.</div><div><br></div><div>- There&#39;s a lot of bikeshedding as to pattern matching with argument labels, as it seems that people generally agree that always requiring them in that scenario would make the experience of using enums worse rather than better. In fact, it seems that what&#39;s cited as a shortcoming in the original proposal (&quot;labels in patterns aren&#39;t enforced&quot;) is precisely what we&#39;re trying to invent new sugar to duplicate.</div><div><br></div><div>Now, since we clearly want enum cases to be tuple-like in some respects (pattern matching) but function-like in other respects, is swinging from one extreme (&quot;cases are tuples!&quot;) to the other (&quot;cases are functions!&quot;) the right thing to do? Does it really make the language more &quot;consistent&quot;?</div><div><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Feb 27, 2017 at 4:10 PM, Matthew Johnson 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:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><span class="gmail-"><br>
&gt; On Feb 27, 2017, at 4:07 PM, Dave Abrahams via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt;<br>
&gt; on Mon Feb 27 2017, Joe Groff &lt;jgroff-AT-apple.com&gt; wrote:<br>
&gt;<br>
&gt;&gt;&gt; On Feb 24, 2017, at 9:26 PM, Daniel Duan &lt;<a href="mailto:daniel@duan.org">daniel@duan.org</a>&gt; wrote:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Before I start revising this proposal, there are a couple of open questions I’d like to discuss<br>
&gt;&gt; with the community and the core team.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; The first question relates to the purpose of having a “internal”<br>
&gt;&gt;&gt; argument name. There are applications of such names in GADT (if we<br>
&gt;&gt;&gt; ever get there) and perhaps the case-as-subtype-of-the-enum stories<br>
&gt;&gt;&gt; on the list right now. Out side of these scenarios, however, such<br>
&gt;&gt;&gt; names has few chances to be used. The one I can come up with, which<br>
&gt;&gt;&gt; is also the “open” part of the question, is this: we can use the<br>
&gt;&gt;&gt; internal names in pattern matching, as opposed to using the<br>
&gt;&gt;&gt; labels. This seems to align with the subtyping/GADT use cases. Is<br>
&gt;&gt;&gt; this a desirable outcome?<br>
&gt;&gt;<br>
&gt;&gt; Why would GADTs make internal argument names useful?<br>
&gt;<br>
&gt; I&#39;ll probably never win this fight, but I&#39;m trying to get people to use<br>
&gt; “parameter name” and “argument label” as the preferred terms.<br>
<br>
</span>I like this terminology.  I’ll start using it.  Thanks for making an attempt to get everyone on the same page!  :)<br>
<div class="gmail-HOEnZb"><div class="gmail-h5"><br>
&gt;<br>
&gt;&gt; They seem completely useless to me. Their &quot;internal&quot;-ness is<br>
&gt;&gt; compromised if you try to hang semantics off of them—they shouldn&#39;t<br>
&gt;&gt; have any impact on use sites.<br>
&gt;&gt;<br>
&gt;&gt;&gt; The second open question is the syntax for “overloaded” cases. If we<br>
&gt;&gt;&gt; decide to allow them, what should the patterns matching them look<br>
&gt;&gt;&gt; like? I can think of one obvious-ish design where we make the<br>
&gt;&gt;&gt; pattern look like the declaration and require types for<br>
&gt;&gt;&gt; disambiguation. So the most verbose form of pattern would look<br>
&gt;&gt;&gt; something like<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; ```<br>
&gt;&gt;&gt; case let .baseName(label0 name0: Type0, label1 name1: Type1)<br>
&gt;&gt;&gt; ```<br>
&gt;&gt;<br>
&gt;&gt; By &quot;overloaded&quot;, do you mean &quot;same name different types&quot;, or &quot;same<br>
&gt;&gt; base name, different argument names&quot;?<br>
&gt;<br>
&gt; When you write &quot;argument name,&quot; do you mean parameter name or argument<br>
&gt; label?  This is an example of why I&#39;d like us to settle on the other<br>
&gt; terminology.<br>
&gt;<br>
&gt;&gt; I think we should have a consistent naming model where the latter is<br>
&gt;&gt; never considered overloading. As an affordance to make pattern<br>
&gt;&gt; matching more concise, it seems reasonable to me to maybe say that a<br>
&gt;&gt; binding pattern matches a label with the same name, so that `case<br>
&gt;&gt; .foo(let bar, let bas)` can match `.foo(bar:bas:)`.<br>
&gt;<br>
&gt; SGTM<br>
&gt;<br>
&gt; --<br>
&gt; -Dave<br>
&gt; ______________________________<wbr>_________________<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/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br>
<br>
______________________________<wbr>_________________<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/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br>
</div></div></blockquote></div><br></div></div></div>