Surprisingly, nobody in this thread has suggested that lists/strings in functional position could accept two arguments. This would replace the current cut function. Additionally, negative numbers should mean index from the end, and 0 as second argument could mean "to the end". Here's Python, Ruby, arc1, and lastly my suggested semantics:
The i'th item of s
s[i]
s[i]
(s i)
(s i)
The i'th item of s from the end
s[-i]
s[-i]
(s (- (len s) i))
(s (- i))
The first x items of s
s[:x]
s[0,x]
(cut s 0 x)
(s 0 x)
The last x items of s
s[-x:]
s[-x..-1]
(cut s (- (len s) x))
(s (- x) 0)
The items from position i to the end
s[i:]
s[i .. -1]
(cut s i)
(s i 0)
The items from position i to position j (inclusive)
s[i:j+1]
s[i .. j]
(cut s i (+ 1 j))
(s i (+ 1 j))
The items from position i to position j (exclusive)
s[i:j]
s[i ... j]
(cut s i j)
(s i j)
i items beginning at position j.
s[j:j+i]
s[j,i]
(cut s j (+ i j))
(s j (+ i j))
The items from position i to the end minus the last j items
s[i:-j]
s[i ... -j]
(cut s i (- -1 j))
(s i (- j))
i items beginning at the j'th position from the end
s[-j:-j+i]
s[-j,i]
(cut s (- (len s) j) (+ (- (len s) j) i))
(s (- j) (+ i (- j)))