Inclusive-exclusive range

368 views
Skip to first unread message

Mibu

unread,
Mar 4, 2009, 7:07:05 AM3/4/09
to Clojure
Why does range in Clojure use an inclusive-exclusive range?

I'm aware of the traditional substring range convention, which always
puzzled me as to how an unintuitive and error-prone use became
cemented as the norm.

I'm not calling for a change in range. I'm just genuinely curious.

Joshua Fox

unread,
Mar 4, 2009, 7:35:10 AM3/4/09
to clo...@googlegroups.com
With pointer-based strings or arrays, as in C , it is natural to start at index 0, so that you can do pointer arithmetic: address+0 is the first character/item.

Then, if you have a string or array of length n, the last item is at n-1.

Joshua

Michael Wood

unread,
Mar 4, 2009, 7:46:09 AM3/4/09
to clo...@googlegroups.com
On Wed, Mar 4, 2009 at 2:07 PM, Mibu <mibu.c...@gmail.com> wrote:
>

For what it's worth, Python's range function works the same way.

--
Michael Wood <esio...@gmail.com>

Joshua Fox

unread,
Mar 4, 2009, 8:06:22 AM3/4/09
to clo...@googlegroups.com
This is discussed, with references, here http://en.wikipedia.org/wiki/Array#Index_of_the_first_element

Mibu

unread,
Mar 4, 2009, 8:06:34 AM3/4/09
to Clojure
On Mar 4, 2:46 pm, Michael Wood <esiot...@gmail.com> wrote:
> On Wed, Mar 4, 2009 at 2:07 PM, Mibu <mibu.cloj...@gmail.com> wrote:
> > Why does range in Clojure use an inclusive-exclusive range?
> For what it's worth, Python's range function works the same way.

I think Clojure's design leans towards what's right more than what's
custom even if it breaks old habits, so I am curious why wasn't this
bad habit broken as well. Is it just convention, bad as it is? Or
maybe I'm missing some hidden good reason for using this confusing (to
me) range over an inclusive range.

Mibu

unread,
Mar 4, 2009, 8:17:47 AM3/4/09
to Clojure
Joshua, my puzzlement is not with the first element but the last.

For example, the (range -1 2) gives (-1 0 1).

Michael Wood

unread,
Mar 4, 2009, 8:35:44 AM3/4/09
to clo...@googlegroups.com
On Wed, Mar 4, 2009 at 3:17 PM, Mibu <mibu.c...@gmail.com> wrote:
>
> Joshua, my puzzlement is not with the first element but the last.
>
> For example, the (range -1 2) gives (-1 0 1).

Because, if you have a vector of 10 elements, (and your language
starts indexing from 0) you can use (range 10) for the indexes,
instead of (range (- 10 1)). Or at least that makes sense to me.

It also makes sense to me that (range 10) gives you 10 numbers. Of
course if range started at 1 by default then I would expect (range 10)
to produce (1 2 3 4 5 6 7 8 9 10), but since it starts at 0 by
default, I think it is correct the way it is.

--
Michael Wood <esio...@gmail.com>

Konrad Hinsen

unread,
Mar 4, 2009, 8:40:59 AM3/4/09
to clo...@googlegroups.com

I wouldn't call it a bad habit just because it's not what you expected.

The definition of range used in Clojure (and elsewhere) has some nice
properties:

(= n (count (range n)))

(= (- b a) (count (range a b)))

(= (concat (range a b) (range b c)) (range a c))

Their utility may not be obvious immediately, but if you write code
that works a lot on indices, you will learn to appreciate them.

Konrad.

Itay Maman

unread,
Mar 4, 2009, 8:56:35 AM3/4/09
to Clojure
(+1 for Konrad's point regarding concat).

Two points, in favor of 0-based indexing (as opposed to 1-based)

When you look at a piece of code and see zero used as an index into
some custom-made collection, you immediately know that this is a
reference to the first item. Except for the rare cases of collections
with negative indexes, it is clear that 0 is the first element. An
index of 1 is ambiguous: It means either the first or the second
element, depending on the convention of the language as well as
whether the programmer who wrote the collection decided to follow the
convention.

The second point is somewhat less significant but it does have a
point: With 1-based you need to write (<= i n) instead of (< i n). It
seems that programmers prefer to write less, hence making 0-based
indexing more popular.

Just my 2c

--
Itay Maman
http://javadots.blogspot.com/

Meikel Brandmeyer

unread,
Mar 4, 2009, 9:25:15 AM3/4/09
to clo...@googlegroups.com
Hi,

Edsger Dijkstra wrote up his opinion, why it should be like that:

http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html

Sincerely
Meikel

Reply all
Reply to author
Forward
0 new messages