<div dir="ltr">On Tue, Jan 31, 2017 at 3:36 PM, David Sweeris via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div dir="auto"><span class="gmail-"><div><br></div><div>On Jan 31, 2017, at 11:32, Jaden Geller via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br><br></div><blockquote type="cite"><div><span>I think that is perfectly reasonable, but then it seems weird to be able to iterate over it (with no upper bound) independently of a collection). It would surprise me if</span><br><span>```</span><br><span>for x in arr[arr.startIndex…] { print(x) }</span><br><span>```</span><br><span>yielded different results than</span><br><span>```</span><br><span>for i in arr.startIndex… { print(arr[i]) } // CRASH</span><br><span>```</span><br><span>which it does under this model.</span><br></div></blockquote><br></span><div>(I <i>think</i> this how it works... semantically, anyway) Since the upper bound isn&#39;t specified, it&#39;s inferred from the context.</div><div><br></div><div>In the first case, the context is as an index into an array, so the upper bound is inferred to be the last valid index.</div><div><br></div><div>In the second case, there is no context, so it goes to Int.max. Then, <i>after</i> the &quot;wrong&quot; context has been established, you try to index an array with numbers from the too-large range.</div><div><br></div><div>Semantically speaking, they&#39;re pretty different operations. Why is it surprising that they have different results?</div></div></blockquote><div><br></div><div>I must say, I was originally rather fond of `0...` as a spelling, but IMO, Jaden and others have pointed out a real semantic issue.</div><div><br></div><div>A range is, to put it simply, the &quot;stuff&quot; between two end points. A &quot;range with no upper bound&quot; _has to be_ one that continues forever. The upper bound _must_ be infinity. What Dave Abrahams has described does not have the semantics of a range with no upper bound. He&#39;s describing a standalone lower bound with no &quot;stuff.&quot; It stands to reason that such a type should not be a sequence at all. But we already use particular types for upper and lower bounds that aren&#39;t sequences, and they&#39;re plain numeric types. Therefore I&#39;d conclude that `arr[upTo: i]` is the most consistent spelling. It also yields the sensible result that `arr[from: i][upTo: j] == arr[upTo: j][from: i] == arr[i..&lt;j]`.</div><div><br></div><div>If `0...` is to have the semantics of a range with no upper bound, I would expect `for i in 0...` to be an infinite loop, equivalent to `for i in stride(from: 0, through: Int.max, by: 1)` for Int.max+1 iterations and then trapping. Which is, well, silly. I&#39;m coming around to thinking that `0...` is a sexy notation for something we don&#39;t need and a poor notation for something that&#39;s more cleanly expressed by plain numbers.</div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div dir="auto"><div>- Dave Sweeris </div></div><br>______________________________<wbr>_________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br>
<br></blockquote></div><br></div></div>