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

Dave Abrahams dabrahams at apple.com
Fri Mar 25 11:23:14 CDT 2016


on Thu Mar 24 2016, Xiaodi Wu <swift-evolution at swift.org> wrote:

> On Thu, Mar 24, 2016 at 4:18 PM, Dave Abrahams via swift-evolution
> <swift-evolution at swift.org> wrote:
>>
>> on Wed Mar 23 2016, Xiaodi Wu <swift-evolution at swift.org> wrote:
>>
>>> So, in other words, you'd be satisfied with the following addition to
>>> the standard library?
>
>>>
>>> ```
>>> extension Range where Element: Strideable {
>>>     func by(step: Element.Stride) -> StrideTo<Element> {
>>>         return startIndex.stride(to: endIndex, by: step)
>>>     }
>>> }
>>>
>>> /*
>>> example of usage:
>>>
>>> for i in (1..<10).by(2) {
>>>     print(i)
>>> }
>>> */
>>> ```
>>
>>
>> My current thinking is that:
>>
>> * `for x in 0.0..<3.0 {}` should probably be an error, because 1.0 is
>>   not the obviously-right stride to use for non-integral numbers.  That
>>   would imply that floating types should not conform to Strideable,
>>   which raises the question of whether Strideable should be folded into
>>   the Integer protocol.
>
> Well, maybe I'm missing something, but `for x in 0.0..<3.0 { }`
> doesn't work as it is, and it doesn't seem to have anything to do with
> Strideable. Rather, HalfOpenInterval<Double> doesn't conform to
> SequenceType. 

True, but the plan is that:

* Interval is going away
* Range will only require that its Bound be Comparable
* Ranges with Strideable bounds will conform to Collection

(see the swift-3-indexing-model branch on GitHub)

> I agree that `for x in 0.0..<3.0 { }` should continue not working, but
> maybe let's keep floating point types conforming to Strideable :)

Those two things are not compatible with the plan we're going to
propose, as described above.

>>
>> * `for x in (0.0..<20.0).striding(by: 1.3) {}` should work without
>>   accumulating error
>>
>
> +1.
>
>> * `for x in 0..<3 {}` should work (obviously; that's the status quo)
>>
>> * `for x in (0..<20).striding(by: 2)` should work
>>
>> I think this might also handle the concerns that
>> https://github.com/apple/swift-evolution/blob/master/proposals/0051-stride-semantics.md
>> was trying to address.
>>
>> If I thought extreme concision was important for this application, I'd be
>> proposing something like
>>
>>   for x in 0.0..<20.0//1.3 {}
>>
>> but personally, I don't, which is why I propose `.striding(by: x)`
>> rather than simply `.by(x)`, the latter being more open to
>> misinterpretation.
>
> Yeah, `.striding(by: x)` is pretty good.
>
>>
>> --
>> Dave
>>
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

-- 
Dave



More information about the swift-evolution mailing list