I've been working on this problem for my own language, and have landed on something more clear than just following a convention. Basically you use []
and ()
to specify if the left and right bounds are included or not (based off of interval notation: https://en.wikipedia.org/wiki/Interval_(mathematics)#Including_or_excluding_endpoints). e.g. for your case
--slice [1:5) # include the left index. don't include the right index
--slice [1:5] # include both left and right index
--slice (1:5] # don't include the left index. include the right index
--slice (1:5) # don't include the left or right index
potentially not relevant to your case, but my version supports an end
keyword which you can do math on, similar to python's negative indexing
[2:end-3] # start at index 2 (included) and go through till the third from last index (included)
(end-3:end] # start at the third from last (excluded) and go to the end (included)
Personally I'm a fan of 0 indexing, but for your context, I think it would depend on how the user sees what they're slicing. E.g. if it was pages with page numbers, the numbers would indicate if it was 0 or 1 index based. If there's nothing to actually show the user, I think picking something reasonable and documenting it well is probably the best bet.