[swift-evolution] [Review] SE-0065 A New Model for Collections and Indices

Dave Abrahams dabrahams at apple.com
Tue Apr 12 17:25:37 CDT 2016


on Tue Apr 12 2016, Nate Cook <swift-evolution at swift.org> wrote:

>     On Apr 12, 2016, at 4:15 AM, Dmitri Gribenko via swift-evolution
>     <swift-evolution at swift.org> wrote:
>
>     On Mon, Apr 11, 2016 at 9:56 PM, Brent Royal-Gordon via
>     swift-evolution <swift-evolution at swift.org> wrote:
>
>     (On the other hand, it might be that I'm conceiving of the purpose of
>         `limitedBy` differently from you—I think of it as a safety measure, but
>         you may be thinking of it specifically as an automatic truncation
>         mechanism.)
>
>     Hi Brent,
>
>     Could you explain what kind of safety do you have in mind? Swift will
>     guarantee memory safety even if you attempt to advance an index past
>     endIndex using the non-limiting overload.
>
> One challenge that I've run into is that the `limitedBy` methods throw away one
> bit of information—namely, did I move as far as I requested or not? 

You're right, Nate.  I think we'll try to fix that in the next iteration.

> Example:
>
> let j = c.index(10, stepsFrom: i, limitedBy: c.endIndex)
>
> There's no way to interpolate the answer to that question efficiently in a
> non-random-access collection. If `j` is equal to `c.endIndex`, that could be
> because `c.endIndex` is ten steps after `i` *or* because the limit kicked in,
> and without checking `c.distance(from: i, to: j)` there's no way to know for
> sure.
>
> If the `limitedBy` methods returned an optional index, we'd get all the
> information that the index-moving algorithm finds (let's hear it for the Law of
> Useful Return!). With that API, we could decide whether to use the returned
> index or not:
>
> // Use the resulting index no matter what:
> let i = c.index(10, stepsFrom: c.startIndex, limitedBy: c.endIndex) ??
> c.endIndex
> let prefix = c.prefix(upTo: i)
>
> // Only use the result if it wasn't limited:
> if let j = c.index(10, stepsFrom: i, limitedBy: c.endIndex) {
> let sub = c[i..<j] // sub.count == 10
> } else {
> // not enough elements...
> }
>
> // "Safe" successor:
> if let j = c.index(1, stepsFrom: i, limitedBy: c.endIndex) {
> // ...
> }
>
> Nate
>
>     Dmitri
>
>     -- 
>     main(i,j){for(i=2;;i++){for(j=2;j<i;j++){if(!(i%j)){j=0;break;}}if
>     (j){printf("%d\n",i);}}} /*Dmitri Gribenko
>     <gribozavr at gmail.com>*/
>     _______________________________________________
>     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