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

Xiaodi Wu xiaodi.wu at gmail.com
Thu Mar 24 03:40:43 CDT 2016


If it's parentheses you want to avoid, you don't need a keyword to do that.
For example, I can make a stride operator `..+` in four lines like so:

```
infix operator ..+ { associativity left precedence 134 }
func ..+ <Element: Strideable>(left: Range<Element>, right: Element.Stride)
-> StrideTo<Element> {
    return left.startIndex.stride(to: left.endIndex, by: right)
}

// example of usage:
for i in 1..<10..+2 {
    print(i)
}
```

The point is, an extension on Range or a custom operator can be constrained
so that Element conforms to Strideable. By contrast, for loops are used to
traverse much more than just ranges. How do you envision your proposed
keyword to interact with everything else? What if I had `var s: Set<Int>`
and tried to write `for i in s by 2`--what do you think should happen? If
you wish to limit `by` to ranges only, what is it about this particular
function that makes it appropriate for a keyword of its own? You will need
more to demonstrate how your proposal achieves what you claim, which is
"improved ease and clearness."


On Thu, Mar 24, 2016 at 2:34 AM, David Knothe via swift-evolution <
swift-evolution at swift.org> wrote:

> I see your point that a simple extension on ranges and similar types would
> also do the thing.
>
> But I do think that this is not as easy as many users would expect.
> For example, I try to avoid parentheses in for loops as much as I can, but
> in your example, 4 additional brackets are required. A simple keyword
> („step" or „by“) would solve the problem seamlessly.
>
> Also, a new template could be introduced that shows the existence of the
> new keyword:
>
> I think adding such a new keyword would improve the ease and the clearness
> of the Swift language more than just adding some protocol extensions.
>
> Am 24.03.2016 um 00:02 schrieb Haravikk <swift-evolution at haravikk.me>:
>
> I’m behind the idea in principle, but I’m not so sure we need a new
> keyword for this:
>
> for eachIndex in (1 ..< 10).by(2) { … }
>
> The above would be adequate I thin, and just requires a new method on
> ranges and similar types. This is being discussed, among other things, in
> the c-style for loop discussion, as these were recently removed but without
> a replacement for this type of use-case.
>
> On 23 Mar 2016, at 21:40, David Knothe via swift-evolution <
> swift-evolution at swift.org> wrote:
>
> Hi,
>
> I am new to Swift mailing list so I don’t know if this topic has already
> been discussed.
>
> I like Swift's range operators ..< and …
> What I am missing though is an easy operator to create a range with a
> specified step. Currently, if you would want to iterate over some odd
> numbers, you had to write:
> *for i in 1.stride(through: 7, by: 2) { … }*
> What I think would be simpler and more convenient would be something like
> the following:
> *for i in 1 … 7 step 2 { … } . *Another option would be  *for i in 1 … 7;
> 2 { … }*
> The keyword ‚step‘ in this context clearly corresponds to the step of the
> range to create or to iterate over.
>
> Essentially this is a syntactic sugar that makes it easy to create ranges
> with a step ≠ 1. What do you think?
> _______________________________________________
> 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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160324/c6b484d8/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: PastedGraphic-1.png
Type: image/png
Size: 5278 bytes
Desc: not available
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160324/c6b484d8/attachment.png>


More information about the swift-evolution mailing list