> On 5 May 2017, at 07:56, Xiaodi Wu <xiaodi...@gmail.com> wrote: > > On Fri, May 5, 2017 at 12:54 AM, David Hart <da...@hartbit.com > <mailto:da...@hartbit.com>> wrote: > > On 5 May 2017, at 07:17, Robert Widmann via swift-evolution > <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote: > >> 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. >> >>> but it is entirely another ballgame to remove labels from tuple patterns >>> altogether. >> >> It’s really not. Let me demonstrate: >> >>> 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. >> >> I am not proposing any changes to switching parameter labels through >> well-typed re-assignments. This is absolutely still going to be allowed: >> >> var z : (Int, Int) = (0, 0) >> var w : (x : Int, y : Int) = (5, 10) >> z = w >> w = z >> >> 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 >> >>> And how about *restating* existing labels without any adding or removing? >>> To be clear: >>> >>> ``` >>> let (partialValue: v, overflow: o) = 42.addingReportingOverflow(42) >>> ``` >>> >>> ...involves absolutely no changes in labels whatsoever. The return type is >>> (partialValue: Int, overflow: ArithmeticOverflow). >> >> 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. >> >>> >>> Either one of these scenarios is commonly used, and it is astonishing to me >>> that they would be eliminated. >> >> 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. > > For what it'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'm all for it. > > If you google "Swift tuple destructuring," it's demonstrated in the third > link you can click on. The article is even titled "best practices": > > https://github.com/terhechte/appventure-blog/blob/master/resources/posts/2015-07-19-tuples-swift-advanced-usage-best-practices.org > > <https://github.com/terhechte/appventure-blog/blob/master/resources/posts/2015-07-19-tuples-swift-advanced-usage-best-practices.org>
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: 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: (z, y, x) = (x, z, y) >> ~Robert Widmann >> >>> On May 5, 2017, at 12:53 AM, Xiaodi Wu <xiaodi...@gmail.com >>> <mailto:xiaodi...@gmail.com>> wrote: >>> >>> Ah, I see from your proposed grammar update: you're proposing to prohibit >>> the use of labels entirely in a tuple pattern. >>> >>> This is much more than just prohibiting tuple shuffling, and I'm rather >>> disappointed that you described such a dramatic change using a corner case. >>> There are very good reasons why someone finds 'let (y: x, x: y) = (x: 1, y: >>> 2)' confusing and would support its removal, but it is entirely another >>> ballgame to remove labels from tuple patterns altogether. >>> >>> >>> On Thu, May 4, 2017 at 23:47 Xiaodi Wu <xiaodi...@gmail.com >>> <mailto:xiaodi...@gmail.com>> wrote: >>> Now I'm confused. The ordinary meaning of the word "shuffle" is not >>> changing but rather reordering, and all of your examples are of reordering. >>> >>> 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. >>> >>> And how about *restating* existing labels without any adding or removing? >>> To be clear: >>> >>> ``` >>> let (partialValue: v, overflow: o) = 42.addingReportingOverflow(42) >>> ``` >>> >>> ...involves absolutely no changes in labels whatsoever. The return type is >>> (partialValue: Int, overflow: ArithmeticOverflow). >>> >>> Either one of these scenarios is commonly used, and it is astonishing to me >>> that they would be eliminated. >>> >>> On Thu, May 4, 2017 at 23:28 Robert Widmann <devteam.cod...@gmail.com >>> <mailto:devteam.cod...@gmail.com>> wrote: >>> That doesn't involve a parameter reordering, but because it changes >>> argument labels it's a shuffle. >>> >>> ~Robert Widmann >>> >>> 2017/05/05 0:16、Xiaodi Wu <xiaodi...@gmail.com >>> <mailto:xiaodi...@gmail.com>> のメッセージ: >>> >>>> Robert, >>>> >>>> As I mentioned on Twitter, getting rid of tuple shuffles would not cure >>>> your example, which does not involve a shuffle. Unless you're proposing to >>>> disallow the use of labels during destructuring entirely, which I would >>>> think to be very much unacceptable. Example: >>>> >>>> ``` >>>> let (partialValue: v, overflow: o) = 42.addingReportingOverflow(42) >>>> ``` >>>> >>>> This involves no shuffling and should absolutely remain allowed. >>>> >>>> >>>> On Thu, May 4, 2017 at 21:15 Robert Widmann via swift-evolution >>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote: >>>> Hi all, >>>> >>>> So sorry that this proposal comes so late in the game, but I feel it’s too >>>> important not to bring it to the attention of the community now. Attached >>>> is a proposal to deprecate a language feature many of you will probably >>>> have never had the chance to use: Tuple Shuffles. I’ve attached a copy of >>>> the first draft of the proposal below, but the latest copy can be read on >>>> Github <https://github.com/apple/swift-evolution/pull/705/files>. >>>> >>>> Thanks! >>>> >>>> ~Robert Widmann >>>> >>>> Deprecate Tuple Shuffles >>>> >>>> Proposal: SE-NNNN >>>> <https://github.com/CodaFi/swift-evolution/blob/8eaf320b3c2a117909fc0269c398e89c033a4b9f/proposals/NNNN-filename.md> >>>> Authors: Robert Widmann <https://github.com/codafi> >>>> Review Manager: TBD >>>> Status: Awaiting review >>>> >>>> <https://github.com/CodaFi/swift-evolution/blob/8eaf320b3c2a117909fc0269c398e89c033a4b9f/proposals/NNNN-deprecate-tuple-shuffles.md#introduction>Introduction >>>> >>>> This proposal seeks the deprecation of a little-known feature of Swift >>>> called a "Tuple Shuffle". >>>> >>>> >>>> <https://github.com/CodaFi/swift-evolution/blob/8eaf320b3c2a117909fc0269c398e89c033a4b9f/proposals/NNNN-deprecate-tuple-shuffles.md#motivation>Motivation >>>> >>>> A tuple-shuffle is an undocumented feature of Swift in which one can >>>> re-order the indices of a tuple by writing a pattern that describes a >>>> permutation in a syntax reminiscent of adding type-annotations to a >>>> parameter list: >>>> >>>> let a = (x: 1, y: 2) >>>> var b: (y: Int, x: Int) >>>> b = a >>>> It can be used to simultaneously destructure and reorder a tuple: >>>> >>>> let tuple = (first: 0, second: (x: 1, y: 2)) >>>> let (second: (x: b, y: c), first: a) = tuple >>>> It can also be used to map parameter labels out of order in a call >>>> expression: >>>> >>>> func foo(_ : (x : Int, y : Int)) {} >>>> foo((y: 5, x: 10)) // Valid >>>> 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: >>>> >>>> var x = 5 >>>> var y = 10 >>>> var z = 15 >>>> (z, y, x) = (x, z, y) >>>> Their inclusion in the language complicates every part of the compiler >>>> stack, uses a syntax that can be confused for type annotations >>>> <https://twitter.com/CodaFi_/status/860246169854894081>, contradicts the >>>> goals of earlier SE's (see SE-0060 >>>> <https://github.com/apple/swift-evolution/blob/9cf2685293108ea3efcbebb7ee6a8618b83d4a90/proposals/0060-defaulted-parameter-order.md>), >>>> and makes non-sensical patterns possible in surprising places. >>>> >>>> Take switch-statements, for example: >>>> >>>> switch ((0, 0), 0){ >>>> case (_ : let (y, z), _ : let s): () // We are forbidden from giving these >>>> patterns names other than "_" >>>> default: () >>>> } >>>> This proposal seeks to deprecate them in Swift 3 compatibility mode and >>>> enforce that deprecation as a hard error in Swift 4 to facilitate their >>>> eventual removal from the language. >>>> >>>> >>>> <https://github.com/CodaFi/swift-evolution/blob/8eaf320b3c2a117909fc0269c398e89c033a4b9f/proposals/NNNN-deprecate-tuple-shuffles.md#proposed-solution>Proposed >>>> solution >>>> >>>> Construction of Tuple Shuffle Expressions will become a warning in Swift 3 >>>> compatibility mode and will be a hard-error in Swift 4. >>>> >>>> >>>> <https://github.com/CodaFi/swift-evolution/blob/8eaf320b3c2a117909fc0269c398e89c033a4b9f/proposals/NNNN-deprecate-tuple-shuffles.md#detailed-design>Detailed >>>> design >>>> >>>> In addition to the necessary diagnostics, the grammar will be ammended to >>>> simplify the following productions: >>>> >>>> tuple-pattern → (tuple-pattern-element-list <opt>) >>>> tuple-pattern-element-list → tuple-pattern-element | tuple-pattern-element >>>> , tuple-pattern-element-list >>>> - tuple-pattern-element → pattern | identifier:pattern >>>> + tuple-pattern-element → pattern >>>> >>>> <https://github.com/CodaFi/swift-evolution/blob/8eaf320b3c2a117909fc0269c398e89c033a4b9f/proposals/NNNN-deprecate-tuple-shuffles.md#impact-on-existing-code>Impact >>>> on Existing Code >>>> >>>> Because very little code is intentionally using Tuple Shuffles, impact on >>>> existing code will be negligible but not non-zero. >>>> >>>> >>>> <https://github.com/CodaFi/swift-evolution/blob/8eaf320b3c2a117909fc0269c398e89c033a4b9f/proposals/NNNN-deprecate-tuple-shuffles.md#alternatives-considered>Alternatives >>>> considered >>>> >>>> Continue to keep the architecture in place to facilitate this feature. >>>> _______________________________________________ >>>> swift-evolution mailing list >>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org> >>>> https://lists.swift.org/mailman/listinfo/swift-evolution >>>> <https://lists.swift.org/mailman/listinfo/swift-evolution> >> >> _______________________________________________ >> swift-evolution mailing list >> swift-evolution@swift.org <mailto:swift-evolution@swift.org> >> https://lists.swift.org/mailman/listinfo/swift-evolution >> <https://lists.swift.org/mailman/listinfo/swift-evolution> >
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution