On Mon, Oct 28, 2013 at 05:06:09PM -0400, Terry Reedy wrote:
On 10/28/2013 2:49 PM, Tim Peters wrote:
under the proposal we have:
s[i:j:k] == s[i:j][::k]
I think where we went wrong with strides was to have the sign of the stride affect the interpretation of i and j (in analogy with ranges). The change is to correct this by decoupling steps 1. and 2. below. The result is that i and j would mean left and right ends of the slice, rather than 'start' and 'stop' ends of the slice.
Sorry Terry, your paragraph above is ambiguous to me. It sounds like you are saying that having slices work by analogy with range was a mistake. Are you suggesting to break the analogy between slicing and range? That is, range continues to work they way it currently does, but change slice?
Whether selecting or replacing, this proposal makes the rule for indicating an arithmetic subsequence to be:
1. indicate the contiguous slice to work on with left and right endpoints (left end i, right end j, i <= j after normalization with same rules as at present);
2. indicate the starting end and direction of movement, left to right (default) or right to left (negate k);
3. indicate whether to pick every member of the slice (k=1, default) or every kth (k > 1), starting with the first item at the indicated end (if there is one) and moving in the appropriate direction.
"pick every kth element" works for k=1 as well as k > 1, no need for a special case here. Every 1th element is every element :-)
My quick take on slicing versus indexing. The slice positions of a single item are i:(i+1). The average is i.5. Some languages (0-based, like Python) round this down to i, others (1-based) round up to i+1.
I don't think it's helpful to talk about averaging or rounding the indexes. Better to talk about whether indexes are included or excluded, or whether the interval is open (end points are excluded) or closed (end points are included). Ruby provides both closed and half-open ranges: 2..5 => 2, 3, 4, 5 2...5 => 2, 3, 4 (If you think that the choice of .. versus ... is backwards, you're not alone.) Ruby has no syntax for stride, but range objects have a step(k) method that returns every kth value. http://www.ruby-doc.org/core-1.9.3/Range.html -- Steven