<div dir="ltr">On Fri, May 5, 2017 at 2:27 AM, David Hart <span dir="ltr">&lt;<a href="mailto:david@hartbit.com" target="_blank">david@hartbit.com</a>&gt;</span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><br><div><div><div class="h5"><blockquote type="cite"><div>On 5 May 2017, at 09:24, Xiaodi Wu &lt;<a href="mailto:xiaodi.wu@gmail.com" target="_blank">xiaodi.wu@gmail.com</a>&gt; wrote:</div><br class="m_3381364236121771299Apple-interchange-newline"><div><div dir="ltr">On Fri, May 5, 2017 at 2:22 AM, David Hart <span dir="ltr">&lt;<a href="mailto:david@hartbit.com" target="_blank">david@hartbit.com</a>&gt;</span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><br><div><span><blockquote type="cite"><div>On 5 May 2017, at 07:56, Xiaodi Wu &lt;<a href="mailto:xiaodi.wu@gmail.com" target="_blank">xiaodi.wu@gmail.com</a>&gt; wrote:</div><br class="m_3381364236121771299m_2990998714880040230Apple-interchange-newline"><div><div dir="ltr">On Fri, May 5, 2017 at 12:54 AM, David Hart <span dir="ltr">&lt;<a href="mailto:david@hartbit.com" target="_blank">david@hartbit.com</a>&gt;</span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><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"><div dir="auto"><span class="m_3381364236121771299m_2990998714880040230gmail-"><div><br></div><div>On 5 May 2017, at 07:17, Robert Widmann via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br><br></div><blockquote type="cite"><div><div>On the contrary, this is precisely what it means to deprecate tuple shuffles.  You can’t map common parlance onto this term; the proposal and the Twitter thread weren’t merely about reordering arguments.</div><div><br></div><div><blockquote type="cite"><div>but it is entirely another ballgame to remove labels from tuple patterns altogether.</div></blockquote><br></div><div>It’s really not.  Let me demonstrate:</div><div><br></div><div><blockquote type="cite"><div><div class="gmail_quote"><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">To be clear, are you proposing the prohibition of *adding or removing* labels as well? A previous discussion on tuple shuffling on this list saw consensus that assigning a value of type (label1: T, label2: U) to a variable of type (T, U) and vice versa should absolutely be supported, whether or not reordering is permitted.</blockquote></div></div></blockquote><br></div><div>I am not proposing any changes to switching parameter labels through well-typed re-assignments.  This is absolutely still going to be allowed:</div><div><br></div><div><div style="margin:0px;font-size:11px;line-height:normal;font-family:menlo"><div style="margin:0px;line-height:normal"><span style="font-variant-ligatures:no-common-ligatures;color:rgb(186,45,162)">var</span><span style="font-variant-ligatures:no-common-ligatures"> z : (</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(112,61,170)">Int</span><span style="font-variant-ligatures:no-common-ligatures">, </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(112,61,170)">Int</span><span style="font-variant-ligatures:no-common-ligatures">) = (</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(39,42,216)">0</span><span style="font-variant-ligatures:no-common-ligatures">, </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(39,42,216)">0</span><span style="font-variant-ligatures:no-common-ligatures">)</span></div><div style="margin:0px;line-height:normal"><span style="font-variant-ligatures:no-common-ligatures;color:rgb(186,45,162)">var</span><span style="font-variant-ligatures:no-common-ligatures"> w : (x : </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(112,61,170)">Int</span><span style="font-variant-ligatures:no-common-ligatures">, y : </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(112,61,170)">Int</span><span style="font-variant-ligatures:no-common-ligatures">) = (</span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(39,42,216)">5</span><span style="font-variant-ligatures:no-common-ligatures">, </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(39,42,216)">10</span><span style="font-variant-ligatures:no-common-ligatures">)</span></div><div style="margin:0px;line-height:normal"><span style="font-variant-ligatures:no-common-ligatures">z = w</span></div><div style="margin:0px;line-height:normal"><span style="font-variant-ligatures:no-common-ligatures">w = z</span></div></div></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:menlo"><span style="font-variant-ligatures:no-common-ligatures"><br></span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:menlo"><div style="font-family:helvetica;font-size:12px">This is modeled internally with a tuple shuffle, but not the kind of shuffle I’m interested in banning.  It’s a far simpler kind of </div><div style="font-family:helvetica;font-size:12px"><br></div><div style="font-family:helvetica;font-size:12px"><blockquote type="cite"><div><div class="gmail_quote"><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">And how about *restating* existing labels without any adding or removing? To be clear:<br><br>```<br>let (partialValue: v, overflow: o) = 42.addingReportingOverflow(42)<br>```<br><br>...involves absolutely no changes in labels whatsoever. The return type is (partialValue: Int, overflow: ArithmeticOverflow).<br></blockquote></div></div></blockquote><div style="font-family:helvetica;font-size:12px"><br></div><div style="font-family:helvetica;font-size:12px">That, however, is a kind of shuffle I intend to deprecate here.  This kind of pattern is subject to the “arcane syntax” part of the proposal.</div><br><blockquote type="cite"><div><div class="gmail_quote"><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"><br>Either one of these scenarios is commonly used, and it is astonishing to me that they would be eliminated.</blockquote></div></div></blockquote><br></div><div style="font-family:helvetica;font-size:12px">Do you have proof of that claim? I have never seen the relevant kinds of tuple shuffle used before, and I doubt you have either before today.</div></div></div></blockquote><div><br></div></span><div>For what it&#39;s worth, I thought I knew Swift inside out and I had never seen or used the syntax your are proposing to ban, so I&#39;m all for it.</div></div></blockquote><div><br></div><div>If you google &quot;Swift tuple destructuring,&quot; it&#39;s demonstrated in the third link you can click on. The article is even titled &quot;best practices&quot;:</div><div><br></div><div><a href="https://github.com/terhechte/appventure-blog/blob/master/resources/posts/2015-07-19-tuples-swift-advanced-usage-best-practices.org" target="_blank">https://github.com/terhechte/a<wbr>ppventure-blog/blob/master/res<wbr>ources/posts/2015-07-19-tuples<wbr>-swift-advanced-usage-best-<wbr>practices.org</a><br></div></div></div></div></div></blockquote><div><br></div></span><span><div>I do know and use tuple destructuring. But AFAIK, that’s not the syntax Robert wants to ban: its the labels in that syntax. As he says:</div><div><br></div><div><i>Note that a tuple shuffle is distinct from a re-assignment through a tuple pattern. For example, this series of statements will continue to function as before:</i></div></span><div><div class="m_3381364236121771299h5"><div><i>(z, y, x) = (x, z, y)</i></div></div></div></div></div></blockquote><div><br></div><div>I&#39;n not saying that you don&#39;t know about tuple destructuring. I&#39;m saying that the particular feature Robert wants to ban is covered in the article I linked to, which at least Google thinks is one of the most relevant articles on tuple destructuring in Swift. So, it&#39;s not as rare as Robert makes it out to be; plenty of people have talked about it.</div></div></div></div></div></blockquote><div><br></div></div></div><div>The article is still called &quot;Advanced Usage”. Its difficult to state how rarely or common a feature is used but my intuition tells me this is a very rare feature. If we’ve discussed it on this list, it has escaped me. And I’ve never seen it in the wild.</div></div></div></blockquote><div><br></div><div>I&#39;d agree that using this feature to reorder things is likely to be very rare. However, you&#39;ve actually never seen someone destructure a tuple using labels? That&#39;s surprising to me. I feel _guilty_ every time I destructure a tuple knowingly not writing labels! It feels...risky.</div><div><br></div></div></div></div>