[swift-evolution] [Accepted with modifications] SE-0045: Add scan, prefix(while:), drop(while:), and unfold to the stdlib

Dave Abrahams dabrahams at apple.com
Fri May 6 21:33:55 CDT 2016


on Fri May 06 2016, Kevin Ballard <swift-evolution at swift.org> wrote:

> On Fri, May 6, 2016, at 06:05 PM, Dave Abrahams via swift-evolution wrote:
>> 
>> on Fri May 06 2016, Kevin Ballard <swift-evolution at swift.org> wrote:
>> 
>> > On Fri, May 6, 2016, at 05:31 PM, Kevin Ballard wrote:
>> >> On Fri, May 6, 2016, at 05:19 PM, Dave Abrahams via swift-evolution wrote:
>
>> >> > 
>> >> > on Wed May 04 2016, Chris Lattner <swift-evolution at swift.org> wrote:
>> >> > 
>> >> > > Proposal link: https://github.com/apple/swift-evolution/blob/master/proposals/0045-scan-takewhile-dropwhile.md
>> >
>> >> > >
>> >> > > Hello Swift Community,
>> >> > >
>> >> > > The review of SE-0045: "Add scan, prefix(while:), drop(while:), and
>> >> > > unfold to the stdlib" ran from April 28...May 3, 2016. A subset of the
>> >> > > proposal is *accepted, with modifications* for Swift 3.  This proposal
>> >> > > included four new additions to the standard library:
>> >> > >
>> >> > > Sequence.prefix(while:) & Sequence.drop(while:) - These are *accepted* as specified in revision 3 of the proposal.
>> >> > 
>> >> > I know the review is over and all, but…
>> >> > 
>> >> > Chris brought to my attention an idea that I liked, and asked me to post
>> >> > here about it.  Specifically, the argument label “where:” would probably
>> >> > be better than “while:”.  “While” makes it sound to me like it's going
>> >> > to take a nullary predicate and be much more active.  But it's hard to
>> >> > love
>> >> > 
>> >> >      s.drop(where: { $0 > 1 })
>> >> >      s.drop { $0 > 1 }
>> >> > 
>> >> > because it makes it sound like a general filtering operation.
>> >> > 
>> >> > Therefore, I'd much rather see
>> >> > 
>> >> >        s.droppingPrefix(where: {$0 > 1})
>> >> 
>> >> Using "where:" has a very high potential for confusion, because
>> >> "where" makes it sound like it runs the predicate against every
>> >> single element, whereas "while" makes it clear that it stops
>> >> evaluating elements once the predicate returns false. Or in other
>> >> words, `drop(where: predicate)` looks like it should be equivalent
>> >> to `filter({ !predicate($0) })`.
>> >
>> > Oops, I read your message too fast and missed the fact that you
>> > changed the function name too in the very last line.
>> 
>> And made the exact point that you made :-)
>
> Indeed. My apologies, I was trying to get through my email too fast and ended up skimming too much.
>
>> > If we switched to `droppingPrefix(where:)` then we'd need to change `dropFirst(_:)` as well.
>> 
>> Yes, as I noted in my response to Erica, I would like to see some more design
>> coherence in this whole area.  I think
>> 
>>           xs.dropFirst()  =>  xs.droppingFirst()
>>           xs.dropFirst(3) => xs.droppingPrefix(ofMaxLength: 3)
>> 
>> I'm not wedded to “dropping,” especially because it has other
>> connotations.  Dmitri, Max, and I kicked around a bunch of other
>> possibilities, e.g.
>> 
>>           sansPrefix
>>           withoutPrefix
>
> If we do rename this, I'm partial to basing it off of the word "skip",
> e.g. skippingPrefix(), since that's similar to "drop" but doesn't have
> the connotation of possibly mutating the receiver. That said, having a
> first argument label "ofMaxLength:" seems overly verbose. Don't forget
> that not everybody has the benefit of Xcode code completion when
> writing Swift code.

Me, for example.  It needs to be at least “maxLength,” IMO, for
clarity.  “of” clarifies that you're not talking about the maximum
length of the result... though I suppose it could be argued that that
misinterpretation wouldn't make any sense.

>> Anyway, we can't do all of that by the seat of our pants.  I personally
>> wouldn't want to go any further than s.dropPrefix(where: ...)  without a
>> new proposal/review.
>
> Agreed, anything beyond that needs a full review. So back to the
> suggestion at hand.
>
> I wrote up a whole long explanation for why I still think "while" is
> the better choice, and then I thought about how this impacts
> `prefix(...:)` instead of `drop(...:)`, and in this context "where:"
> makes more sense. `prefix(while:)` turns "prefix" from a noun into a
> verb, 

Sorta, yeah.

> and the verb meaning of "prefix" is not at all what we're doing with
> this operation. But `prefix(where:)` is still a noun and makes
> sense. And of course if we have `prefix(where:)` then it's a bit odd
> to have `drop(while:)`, so we'd have to go with `drop(where:)` or
> `dropPrefix(where:)`. So I guess I've now convinced myself while
> writing this email that "where:" is the right choice :D

:D


> That said, given that we already have `dropFirst(_:)`, maybe we should
> go with `dropFirst(where:)` instead of `dropPrefix(where:)`? Otherwise
> it's a bit odd to have both "dropFirst" and "dropPrefix" as
> names. 

Agreed, that might make a more reasonable interim stopping point.

> Admittedly, this same argument applies to the existing `drop(while:)`
> name too, and I don't have a great explanation for that beyond the
> fact that I had a vague idea that dropFirst(_:) might be renamed to
> drop(first:), though that can't actually happen because having both
> dropFirst() and drop(first:) is hugely confusing, and it doesn't make
> sense to rename dropFirst() to drop().

Ya just lost me in those twisty turns, sorry.

-- 
Dave



More information about the swift-evolution mailing list