[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