<div dir="ltr">Many thanks, Vladimir, I wasn&#39;t familiar with this yet. :-)<div><br></div><div>- Luis</div><div class="gmail_extra">
<br><div class="gmail_quote">On Sun, Apr 24, 2016 at 7:10 AM, Vladimir.S 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><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">We already have this feature(to append labels for substiption), so I believe it is possible to implement this proposal:<br>
<br>
class A {<br>
    subscript(safe range: Range&lt;Int&gt;) -&gt; [Int] {<br>
        get { return [1,2,3] } set { print(newValue) }<br>
    }<br>
<br>
    subscript(truncate range: Range&lt;Int&gt;) -&gt; [Int] {<br>
        get { return [1,2,3] } set { print(newValue) }<br>
    }<br>
}<br>
<br>
var a = A()<br>
<br>
var arr = a[safe: 0...10]<br>
print(arr)<br>
arr = a[truncate: 0...10]<br>
print(arr)<span class=""><br>
<br>
<br>
On 23.04.2016 12:25, Luis Henrique B. Sousa via swift-evolution wrote:<br>
</span><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">
No, I got the half-joke on the python-like example. :-)<br>
<br>
I meant the label as part of the brackets content, right before the range<br>
itself. E.g. [truncate: Range&lt;Index&gt;]<br>
where &quot;truncate&quot; is the label I&#39;m referring to.<br>
<br>
Thanks<br>
<br>
- Luis<br>
<br>
On Friday, April 22, 2016, Dave Abrahams via swift-evolution<br></span><div><div class="h5">
&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a> &lt;mailto:<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;&gt; wrote:<br>
<br>
<br>
    on Fri Apr 22 2016, &quot;Luis Henrique B. Sousa via swift-evolution&quot;<br>
    &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br>
<br>
    &gt; is this syntax reasonably simple to implement?<br>
<br>
    If you mean a syntax that allows 0..&lt;-2, it&#39;s implementable but I&#39;d be<br>
    opposed to it.  You&#39;d have to introduce a new overload of ..&lt; that<br>
    produced something other than a Range or CountableRange, because those<br>
    have a precondition that the LHS is &lt;= the RHS.<br>
<br>
    &gt; Or is there another solution that would work with less impact in terms<br>
    &gt; of design?  I mean the subscript with a label on it,<br>
    &gt; i.e. collection[label: Range&lt;Index&gt;]<br>
<br>
    I&#39;m sure there are lots of other possibilities :-)<br>
<br>
    &gt;<br>
    &gt; It&#39;s been a while since the last feedback, so I&#39;m doing some rewriting<br>
    &gt; on this proposal and still considering to submit it for review.<br>
    &gt;<br>
    &gt; - Luis<br>
    &gt;<br>
    &gt; On Wed, Apr 13, 2016 at 10:29 PM, Dave Abrahams via swift-evolution<br>
    &gt; &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br>
    &gt;<br>
    &gt;     on Wed Apr 13 2016, Maximilian Hünenberger<br>
    &gt;     &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br>
    &gt;<br>
    &gt;     &gt; Should this new operator form a new range? How can this range<br>
    know about<br>
    &gt;     the<br>
    &gt;     &gt; array&#39;s indices?<br>
    &gt;     &gt;<br>
    &gt;     &gt; A while ago there was a proposal (unfortunately it was not<br>
    discussed<br>
    &gt;     enough)<br>
    &gt;     &gt; which introduced safe array indexing:<br>
    &gt;     &gt;<br>
    &gt;     &gt; array[safe: 3] // returns nil if index out of bounds<br>
    &gt;<br>
    &gt;     Wrong label, but I wouldn&#39;t be opposed to adding such an operator for<br>
    &gt;     all Collections.<br>
    &gt;<br>
    &gt;     &gt; So another way to handle this issue would be to make another<br>
    subscript<br>
    &gt;     like:<br>
    &gt;     &gt;<br>
    &gt;     &gt; array[truncate: -1...6]<br>
    &gt;<br>
    &gt;     That approach makes sense too. But then do we add<br>
    &gt;<br>
    &gt;     x[python: 0..&lt;-2] // all but the last two elements?<br>
    &gt;<br>
    &gt;     ;^)<br>
    &gt;<br>
    &gt;     &gt; Best regards<br>
    &gt;     &gt; - Maximilian<br>
    &gt;     &gt;<br>
    &gt;     &gt; Am 12.04.2016 um 01:21 schrieb Luis Henrique B. Sousa via<br>
    swift-evolution<br>
    &gt;     &gt; &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;:<br>
    &gt;     &gt;<br>
    &gt;     &gt; The idea of having a new operator following the principles of<br>
    overflow<br>
    &gt;     &gt; operators looks great. Two distinct operators doing implicit and<br>
    &gt;     explicitly<br>
    &gt;     &gt; might really be a good way to go; it would be concise and<br>
    wouldn&#39;t look<br>
    &gt;     like<br>
    &gt;     &gt; some magic happened behind the scenes. I&#39;d like to hear more<br>
    opinions<br>
    &gt;     about<br>
    &gt;     &gt; it.<br>
    &gt;     &gt;<br>
    &gt;     &gt; &gt; what we&#39;ll have in case a[-1 &amp;..&lt; 5]? should this raise error<br>
    or become<br>
    &gt;     [0<br>
    &gt;     &gt; ..&lt; 3] ? I think, the latter.<br>
    &gt;     &gt; I agree here, I&#39;d choose the latter.<br>
    &gt;     &gt;<br>
    &gt;     &gt; From my perspective, the behaviour I&#39;m proposing is what a<br>
    considerable<br>
    &gt;     &gt; number of users expect, especially if coming from other<br>
    languages that<br>
    &gt;     &gt; follow that path. Of course I&#39;m not comparing languages here, but<br>
    &gt;     &gt; considering the Swift principles of being a safer language, in<br>
    my opinion<br>
    &gt;     &gt; we&#39;d rather have a partial slice than a crash in execution time<br>
    (when the<br>
    &gt;     &gt; user is not totally aware of it).<br>
    &gt;     &gt;<br>
    &gt;     &gt; Many thanks for all your additions so far. It&#39;s really good to<br>
    see that<br>
    &gt;     &gt; these things are not set in stone yet.<br>
    &gt;     &gt;<br>
    &gt;     &gt; - Luis<br>
    &gt;     &gt;<br>
    &gt;     &gt; On Apr 11, 2016 4:21 PM, &quot;Vladimir.S via swift-evolution&quot;<br>
    &gt;     &gt; &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br>
    &gt;     &gt;<br>
    &gt;     &gt; +1 for the idea &quot;in general&quot;. But I also think that explicit is<br>
    better<br>
    &gt;     than<br>
    &gt;     &gt; implicit, especially if we deal with possible errors. Just like<br>
    we work<br>
    &gt;     &gt; in Swift with integer overflow : &#39;+&#39; will generate run time<br>
    error, but<br>
    &gt;     &gt; saying &amp;+ we point Swift that we know what we do.<br>
    &gt;     &gt;<br>
    &gt;     &gt; but.. what we&#39;ll have in case a[-1 &amp;..&lt; 5]? should this raise<br>
    error or<br>
    &gt;     &gt; become [0 ..&lt; 3] ? I think, the latter.<br>
    &gt;     &gt;<br>
    &gt;     &gt; On 11.04.2016 17:02, Haravikk via swift-evolution wrote:<br>
    &gt;     &gt;<br>
    &gt;     &gt; I like the idea in theory, but the question is; is it really<br>
    safer to<br>
    &gt;     &gt; return a result that the developer may not have wanted, versus an<br>
    &gt;     &gt; error<br>
    &gt;     &gt; indicating that a mistake may have been made? I wonder if perhaps<br>
    &gt;     &gt; there<br>
    &gt;     &gt; could be an alternative, such as a variation of the operator like<br>
    &gt;     &gt; so:<br>
    &gt;     &gt;<br>
    &gt;     &gt; let b = a [0 &amp;..&lt; 5]// Equivalent to let b = a[0 ..&lt; min(5,<br>
    &gt;     &gt; a.endIndex)],<br>
    &gt;     &gt; becomes let b = a[0 ..&lt; 3]<br>
    &gt;     &gt;<br>
    &gt;     &gt; I’m just not sure that we can assume that an array index out of<br>
    &gt;     &gt; range error<br>
    &gt;     &gt; is okay without some kind of indication from the developer, as<br>
    &gt;     &gt; otherwise we<br>
    &gt;     &gt; could end up returning a partial slice, which could end up causing<br>
    &gt;     &gt; an error<br>
    &gt;     &gt; elsewhere where the size of the slice is assumed to be 5 but isn’t.<br>
    &gt;     &gt;<br>
    &gt;     &gt; On 11 Apr 2016, at 13:23, Luis Henrique B. Sousa via<br>
    &gt;     &gt; swift-evolution<br>
    &gt;     &gt; &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
    &gt;     &gt; &lt;mailto:<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;&gt;<br>
    &gt;     &gt; wrote:<br>
    &gt;     &gt;<br>
    &gt;     &gt; This proposal seeks to provide a safer ..&lt; (aka half-open range<br>
    &gt;     &gt; operator)<br>
    &gt;     &gt; in order to avoid **Array index out of range** errors in<br>
    &gt;     &gt; execution time.<br>
    &gt;     &gt;<br>
    &gt;     &gt; Here is my first draft for this proposal:<br>
    &gt;     &gt;<br>
    &gt;<br>
     <a href="https://github.com/luish/swift-evolution/blob/half-open-range-operator/proposals/nnnn-safer-half-open-range-operator.md" rel="noreferrer" target="_blank">https://github.com/luish/swift-evolution/blob/half-open-range-operator/proposals/nnnn-safer-half-open-range-operator.md</a><br>
    &gt;<br>
    &gt;     &gt;<br>
    &gt;     &gt; In short, doing that in Swift causes a runtime error:<br>
    &gt;     &gt;<br>
    &gt;     &gt; leta =[1,2,3]<br>
    &gt;     &gt; letb =a[0..&lt;5]<br>
    &gt;     &gt; print(b)<br>
    &gt;     &gt;<br>
    &gt;     &gt; &gt; Error running code:<br>
    &gt;     &gt; &gt; fatal error: Array index out of range<br>
    &gt;     &gt;<br>
    &gt;     &gt; The proposed solution is to slice the array returning all<br>
    &gt;     &gt; elements that<br>
    &gt;     &gt; are below the half-open operator, even though the number of<br>
    &gt;     &gt; elements is<br>
    &gt;     &gt; lesser than the ending of the half-open operator. So the example<br>
    &gt;     &gt; above<br>
    &gt;     &gt; would return [1,2,3].<br>
    &gt;     &gt; We can see this very behaviour in other languages, such as<br>
    &gt;     &gt; Python and<br>
    &gt;     &gt; Ruby as shown in the proposal draft.<br>
    &gt;     &gt;<br>
    &gt;     &gt; This would eliminate the need for verifications on the array<br>
    &gt;     &gt; size before<br>
    &gt;     &gt; slicing it -- and consequently runtime errors in cases when the<br>
    &gt;     &gt; programmer didn&#39;t.<br>
    &gt;     &gt;<br>
    &gt;     &gt; Viewing that it is my very first proposal, any feedback will be<br>
    &gt;     &gt; helpful.<br>
    &gt;     &gt;<br>
    &gt;     &gt; Thanks!<br>
    &gt;     &gt;<br>
    &gt;     &gt; Luis Henrique Borges<br>
    &gt;     &gt; @luishborges<br>
    &gt;     &gt; _______________________________________________<br>
    &gt;     &gt; swift-evolution mailing list<br>
    &gt;     &gt; <a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
    &gt;     &gt; &lt;mailto:<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;<br>
    &gt;     &gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
    &gt;     &gt;<br>
    &gt;     &gt; _______________________________________________<br>
    &gt;     &gt; swift-evolution mailing list<br>
    &gt;     &gt; <a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
    &gt;     &gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
    &gt;     &gt;<br>
    &gt;     &gt; _______________________________________________<br>
    &gt;     &gt; swift-evolution mailing list<br>
    &gt;     &gt; <a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
    &gt;     &gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
    &gt;     &gt;<br>
    &gt;     &gt; _______________________________________________<br>
    &gt;     &gt; swift-evolution mailing list<br>
    &gt;     &gt; <a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
    &gt;     &gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
    &gt;     &gt;<br>
    &gt;     &gt; _______________________________________________<br>
    &gt;     &gt; swift-evolution mailing list<br>
    &gt;     &gt; <a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
    &gt;     &gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
    &gt;<br>
    &gt;     --<br>
    &gt;     Dave<br>
    &gt;<br>
    &gt;     _______________________________________________<br>
    &gt;     swift-evolution mailing list<br>
    &gt;     <a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
    &gt;     <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
    &gt;<br>
    &gt; _______________________________________________<br>
    &gt; swift-evolution mailing list<br>
    &gt; <a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
    &gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
<br>
    --<br>
    Dave<br>
<br>
    _______________________________________________<br>
    swift-evolution mailing list<br>
    <a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
    <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
<br>
<br>
<br>
--<br>
<br>
<br>
---<br>
<br></div></div>
*Luís Henrique Borges*<br>
iOS Developer at IBM &lt;<a href="http://ibm.com" rel="noreferrer" target="_blank">http://ibm.com</a>&gt;<br>
Dublin, Ireland - <a href="http://luish.github.com" rel="noreferrer" target="_blank">luish.github.com</a> &lt;<a href="http://luish.github.com" rel="noreferrer" target="_blank">http://luish.github.com</a>&gt;<span class=""><br>
<br>
<br>
<br>
_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
<br>
</span></blockquote><div class="HOEnZb"><div class="h5">
_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
</div></div></blockquote></div><br></div></div>