Dijkstra specifically said that in Mesa it was a bad idea to include anything other than `..&lt;` the relevent quote is:<div><br></div><div>&quot;<font size="2"><span style="background-color:rgba(255,255,255,0)">Extensive experience with Mesa has shown that the use of the other three conventions has been a constant source of clumsiness and mistakes, and on account of that experience Mesa programmers are now strongly advised not to use the latter three available features. I mention this experimental evidence —for what it is worth— because some people feel uncomfortable with conclusions that have not been confirmed in practice.&quot;</span></font></div><div><font size="2"><span style="-webkit-tap-highlight-color: rgba(26, 26, 26, 0.301961);"><br></span></font></div><div><font size="2"><span style="background-color:rgba(255,255,255,0)"></span><span style="-webkit-tap-highlight-color: rgba(26, 26, 26, 0.301961);">In the above quote the first convention is `..&lt;` and the other three are `&lt;..`, `...`, and `&lt;.&lt;` respectively. Therefore he is suggesting that even `...` should not be included.</span></font></div><div><font size="2"><span style="-webkit-tap-highlight-color: rgba(26, 26, 26, 0.301961);"><br></span></font></div><div><font size="2"><span style="-webkit-tap-highlight-color: rgba(26, 26, 26, 0.301961);">Personally I would go against Dijksra&#39;s advice and include all 4 as operators, however if Dijkstra is followed and only `..&lt;` remains then the &#39;lesser&#39; cases could be covered with an init on Range:</span></font></div><div><font size="2"><span style="-webkit-tap-highlight-color: rgba(26, 26, 26, 0.301961);"><br></span></font></div><div><font size="2"><span style="-webkit-tap-highlight-color: rgba(26, 26, 26, 0.301961);">    init Range(first: T, isFirstIncluded: Bool = true, last: T, isLastIncluded: Bool = true, stride: Int = 1)<br></span></font><br>On Thursday, 7 April 2016, Dave Abrahams via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
on Wed Apr 06 2016, Brent Royal-Gordon &lt;<a href="javascript:;" onclick="_e(event, &#39;cvml&#39;, &#39;swift-evolution@swift.org&#39;)">swift-evolution@swift.org</a>&gt; wrote:<br>
<br>
&gt;&gt; From a purely numerically aesthetic point of view, I&#39;d much prefer ranges to be<br>
&gt;&gt; openable and closable at both ends.<br>
&gt;&gt;<br>
&gt;&gt; My primary use-case has been teaching math using playgrounds but I&#39;m sure<br>
&gt;&gt; there are lots of other real-world situations more specific to common numerical<br>
&gt;&gt; method tasks.<br>
&gt;<br>
&gt; By coincidence, a Perl hacker I know commented on Twitter yesterday<br>
&gt; that he thought 1-based arrays were the way to go in the 21st<br>
&gt; century. Somebody replying to that suggestion linked to a note by<br>
&gt; Dijkstra that&#39;s relevant to this conversation:<br>
&gt; &lt;<a href="https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html" target="_blank">https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html</a>&gt;<br>
&gt;<br>
&gt; I&#39;d suggest everyone in this discussion should read it—it&#39;s only about 700 words—but to summarize:<br>
&gt;<br>
&gt;       1. The semantic Swift refers to as `..&lt;` is the most natural range convention.<br>
&gt;       2. Relatedly, zero-based indexing is the most natural indexing convention.<br>
&gt;<br>
&gt; If we agree with Dijkstra&#39;s logic, then the only reason to support<br>
&gt; `&gt;..` is for ranges where start &gt; end—that is, when we&#39;re constructing<br>
&gt; a reversed range.<br>
<br>
I (am familiar with and) agree with Dijkstra&#39;s logic, but not with your<br>
conclusion about it.  The fact that one representation is more natural<br>
for most common computing tasks doesn&#39;t mean it&#39;s not worth supporting<br>
the other representations.<br>
<br>
&gt; But if we decide to support striding backwards by using a forward<br>
&gt; range and a negative stride, then that covers the reverse use<br>
&gt; case. Thus, we would need neither additional range operators, nor<br>
&gt; reversed ranges.<br>
&gt;<br>
&gt; As for the `range.striding(by:)` vs `stride(over:by:)` question, my<br>
&gt; concerns there are, to be honest, mainly aesthetic. The need for<br>
&gt; parentheses around the range operator is more or less unavoidable, but<br>
&gt; I think they make the construct very ugly. However, I also think that<br>
&gt; the `stride(over:by:)` syntax (or, for that matter<br>
&gt; `stride(from:to:by:)`) look more constructor-y (they are only *not*<br>
&gt; constructors now because of the overloading), and I think it opens us<br>
&gt; up to parallel constructs like the `induce(from:while:by:)` function<br>
&gt; I&#39;ve been working on.<br>
<br>
--<br>
Dave<br>
<br>
_______________________________________________<br>
swift-evolution mailing list<br>
<a href="javascript:;" onclick="_e(event, &#39;cvml&#39;, &#39;swift-evolution@swift.org&#39;)">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
</blockquote></div><br><br>-- <br>-- Howard.<br>