<div dir="ltr">On Thu, Nov 2, 2017 at 7:26 PM, Brent Royal-Gordon 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><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">During the Swift 3 cycle, I proposed SE-0132, &quot;Rationalizing Sequence end-operation names&quot;. It was rejected because it needed revision and there was no time to do so. Since then, part of the proposal—partial ranges and the `RangeExpression` slicing protocol—has been adopted in SE-0172, &quot;One-sided Ranges&quot;. I&#39;&#39;d like to reopen discussion of the rest of the proposal.<br>
<br>
To refresh your memory, SE-0132 proposed systematically renaming a number of `Sequence` and `Collection` methods which operate on the beginning and end of a sequence. Many of these methods have names borrowed directly from functional programming; they use terminology in conflicting ways and don&#39;t follow our conventions for non-mutating method names. For example, consider the inconsistent and API Guideline-violating names of a few members which operate on the beginning of a sequence or collection:<br>
<br>
        first                   dropFirst()                     removeFirst()<br>
        prefix(_:)              dropFirst(_:)                   removeFirst(_:)<br>
        prefix(while:)  drop(while:)                    —<br>
<br>
These members could be renamed to form consistent &quot;families&quot; where a given term always meant the same thing:<br>
<br>
        first                   removingFirst()         removeFirst()<br>
        prefix(_:)              removingPrefix(_:)              removePrefix(_:)<br>
        prefix(while:)  removingPrefix(while:)  —<br>
<br>
The main question in my mind about this plan is source stability. Back during Swift 3, we broke compatibility willy-nilly, but today we&#39;re being a little more circumspect. I believe these names meet the criteria of being actively harmful—they are difficult to discover, so developers don&#39;t use these members even when they should, and many of them sound like mutating methods or are unclear about their purpose—but that still doesn&#39;t tell us how we should treat the old names.<br>
<br>
Basically, when should we introduce the new names?<br>
<br>
        1. Swift 4.1 (or whatever pre-Swift 5 version the proposal ends up landing in)<br>
        2. Swift 4.n (the version of Swift 5&#39;s compatibility mode for Swift 4)<br>
        3. Swift 5<br></blockquote><div><br></div><div>(All of the following IMHO:)</div><div><br></div><div>Swift 4.1 or whatever is closest. The new names are very clear, and their introduction doesn&#39;t impair backwards compatibility.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
And when should we deprecate the old ones?<br>
<br>
        1. Swift 4.1<br>
        2. Swift 4.n<br>
        3. Swift 5<br>
        4. Swift 6<br>
        5. Never<br></blockquote><div><br></div><div>Deprecation warnings: Swift 5. Code continues to compile, and fix-its and a migrator can get rid of the warning.</div><div>Removal of deprecated API: Swift 6; ABI stability may require these symbols to continue to exist though.</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I&#39;m also open to discussion about whether this should be done at all, whether any additional methods should be included (or included methods should be left alone), whether the now-obsolete `prefix(from:)` `prefix(upTo:)`, and `prefix(through:)` methods should be left alone, deprecated, or removed, and whether this should be done in this proposal or a different one.<br></blockquote><div><br></div><div>Could deprecate in Swift 5--don&#39;t feel strongly about this one. Definitely a separate proposal.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
The original proposal, which lists all affected methods and explains the logic behind them, is available at &lt;<a href="https://github.com/apple/swift-evolution/blob/master/proposals/0132-sequence-end-ops.md" rel="noreferrer" target="_blank">https://github.com/apple/<wbr>swift-evolution/blob/master/<wbr>proposals/0132-sequence-end-<wbr>ops.md</a>&gt;. Keep in mind that the parts about ranges have already been incorporated into Swift in a revised form, so you can ignore them.<br>
<br>
I&#39;ll get cracking on an implementation once we figure out what I should implement.<br>
<br>
Thanks!<br></blockquote><div> </div></div></div></div>