[swift-evolution] Feature proposal: Range operator with step

Dave Abrahams dabrahams at apple.com
Wed Mar 30 13:42:02 CDT 2016


on Tue Mar 29 2016, Xiaodi Wu <xiaodi.wu-AT-gmail.com> wrote:

> On Tue, Mar 29, 2016 at 7:48 PM, Dave Abrahams <dabrahams at apple.com> wrote:
>>
>> on Tue Mar 29 2016, Xiaodi Wu <xiaodi.wu-AT-gmail.com> wrote:
>>
>>> Relatedly, while you're tackling this big revision:
>>>
>
>>> I've tried to play around with what it would take to write a generic
>>> non-error-accumulating striding method, and afaict, it would be
>>> enormously cleaner if Strideable types are guaranteed to have + and *
>>> (well, Strideable.Stride needs *, to be more accurate),
>>
>> That should happen automatically, since it conforms to SignedNumber,
>> when we get the Integer protocols updated (project currently on hold while
>> we land this other revision).
>>
>>> since the iterator needs to be able to compute end = start + iteration
>>> * stride.
>>
>> Don't you need division too if you're going to do this?
>
> I didn't seem to ever need division. See attached playground (which
> borrows shamelessly from existing code and Erica's proposal, and which
> is written in Swift 2.2 because that's what I had handy).

I guess it depends what semantics you want.  Maybe the semantics that
need division are better suited to a different API:

  (a..<b).striding(stepCount: 10)

>>> Is that going to be exposed somewhere in the cascade of numeric
>>> protocols that culminate in Strideable?
>>
>> That's not in the plan.  I'm pretty sure we want UnsafePointer to be
>> Strideable and we don't want it to have multiplication or division.
>
> You're right. The type itself doesn't need to have multiplication or
> division. In fact, writing this, I'm going back and changing my
> playground a bit. It's sufficient that UnsafePointer.Stride can be
> multiplied, and if SignedNumber conformance will guarantee
> multiplication for all conforming types, we're all set for floating
> point.
>
>>
>> I was thinking the StrideSequence (or some such) should be exposed as an
>> associated type of the Strideable, so it can be as efficient as possible
>> when no FP error is possible.  We don't want to spend divisions on
>> striding over Ints.
>
> Right, multiplication or division best avoided here. Not sure what the
> associated type StrideSequence would be for though? 

Well, the multiplications can likely be optimized away, so maybe it's a
non-issue. It's really worth looking at the code you get at -O, to see
if we can avoid complicating the API.

The thinking was that a Strideable type could have a StrideSequence with
a default of StrideByAdding<Self>, while FloatingPoint types would use
StrideSequence = StrideByMultiplying<Self>.

> Are you aiming for one StrideTo type and one StrideThrough type
> instead of two apiece

Either way would be reasonable, depending on how well it optimizes.

> , one for floating point and one for integer?

No, one for FP and one for most everything else.

> I've been lazy and overloading `stride(from:to:by:)` instead, but
> there's a lot of repeated code.
>
>>
>>> On Mon, Mar 28, 2016 at 7:45 PM Dave Abrahams via swift-evolution <swift-evolution at swift.org> wrote:
>>>
>>>     on Mon Mar 28 2016, Dave Abrahams <swift-evolution at swift.org> wrote:
>>>
>>>     > on Mon Mar 28 2016, Erica Sadun <swift-evolution at swift.org> wrote:
>>>     >
>>>     >>> On Mar 28, 2016, at 3:54 PM, Dave Abrahams via swift-evolution <swift-evolution at swift.org> wrote:
>>>     >>>
>>>     >>>
>>>     >>> on Mon Mar 28 2016, Erica Sadun <swift-evolution at swift.org> wrote:
>>>     >>>
>>>     >>
>>>     >>>>> On Mar 28, 2016, at 3:25 PM, Dave Abrahams via swift-evolution
>>>     >>>>> <swift-evolution at swift.org> wrote:
>>>     >>>>>
>>>     >>>>>
>>>     >>>>> on Mon Mar 28 2016, Xiaodi Wu
>>>     >>>>
>>>     >>>>> <swift-evolution at swift.org
>>>     >>>>> <mailto:swift-evolution at swift.org>>
>>>     >>>>> wrote:
>>>     >>>>>
>>>     >>>>>> Right, Countable could refine Strideable. I'm no expert on this, but
>>>     >>>>>> some cursory reading suggests that the analogous feature in C++ simply
>>>     >>>>>> requires the type to have operator++ defined. Obviously, that won't
>>>     >>>>>> work for Swift 3.0...
>>>     >>>>>
>>>     >>>>> Hmm, instead of defining a new protocol (Countable), what if we just use
>>>     >>>>> “Strideable where Stride : Integer” as a constraint?
>>>     >>>>
>>>     >>>> I like a differentiation between continuous and discrete things
>>>     >>>> although both can have ranges, membership, fences,
>>>     >>>> and a way to stride through them
>>>     >>>
>>>     >>> Strideable where Stride : Integer expresses just exactly that. Now if I
>>>     >>> could only get the type-checker to cooperate...
>>>     >>
>>>     >> I am ridiculously excited about what you're doing there.
>>>     >> Looking forward to beautiful floating point strides if for no
>>>     >> other reason than I can point out how well they work for math
>>>     >> in comparison to traditional for;;loops, so maybe people will
>>>     >> stop burning semicolons on my lawn.
>>>     >
>>>     > The basics:
>>>     > https://github.com/apple/swift/commit/a5c3c63c3d5d940f729c23aab342ea4d270d264a
>>>
>>>     Hi Erica,
>>>
>>>     After some consideration, while I want to see the smart
>>>     (x..<y).striding(by: z) stuff happen too, it's somewhat incidental to
>>>     the (already massive) project we're undertaking in this branch. Would
>>>     you like to take on the implementation and/or proposal? I'd be happy to
>>>     provide guidance.
>>>
>>>     --
>>>     Dave
>>>
>>>     _______________________________________________
>>>     swift-evolution mailing list
>>>     swift-evolution at swift.org
>>>     https://lists.swift.org/mailman/listinfo/swift-evolution
>>>
>>
>> --
>> Dave
>

-- 
Dave


More information about the swift-evolution mailing list