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

Kevin Ballard kevin at sb.org
Fri May 6 23:16:11 CDT 2016


On Fri, May 6, 2016, at 07:33 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 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.

How about "count"? `skippingFirst(count:)` is not too long and it's reasonably descriptive.

> >> 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.

What I meant was that `drop(while:)` doesn't match the existing `dropFirst(_:)` name either (just as `dropPrefix` wouldn't), and my reasons for proposing `drop(while:)` instead of `dropFirst(while:)` were not well-founded.

-Kevin Ballard


More information about the swift-evolution mailing list