[REBOL] On ordinal and cardinal numbers...
From: g::santilli::tiscalinet::it at: 6-Jul-2001 18:55
(Dedicated to Jeff and Joel :)
I didn't want to partecipate to the "indexing" thread... but I
couldn't resist pointing out my point of view. I promise I'll keep
this message as short as possible; I'll send a personal mail with
all the reasoning for the following to anyone that really wants to
read such a thing. :-)
- Ordinal numbers and Cardinal numbers are different things. I
see everyone here seems to confuse the two concepts. The set of
cardinal (i.e. natural) number is {0, 1, 2, 3, ...} and is
defined by the axioms presented by Joel. The set of ordinal
numbers has nothing to do with the above, and is {1st, 2nd,
3rd, ...}. Jeff, please notice that the set of ordinal numbers
does not contain the symbol 0th or zeroeth. This monster exists
for other reasons, which I think I can explain if you want.
- The two sets above CAN be put in 1-1 relationship. The common
1-1 relationship between the two is {(0, 1st), (1, 2nd), (2,
3rd), ...} which says that 0 is the first natural number, 1 is
the second natural number, and so on. Please notice that REBOL
perfectly agrees with this:
>> N: [0 1 2 3 4 5 6 7 8 9 10 11 12] ; and so on... imagine this being infinite
== [0 1 2 3 4 5 6 7 8 9 10 11 12]
>> first N
== 0
>> second N
== 1
>> third N
== 2
Again, Jeff: 0 is not the zeroeth natural number. It is the
FIRST natural number, as REBOL correctly reports.
- REBOL's series functions are perfectly consistent as long as
you view them in the right prospective. PICK does not accept a
natural number as is second arguments; it requires an ordinal
number instead. (Pity REBOL does not include an ordinal!
datatype, of course Carl thought it was superflous to add since
the set of ordinal numbers can be represented by a subset of
the set of natural numbers (i.e. N - {0}); unfortunately this
seemed to create a certain confusion amongst REBOL users.)
Actually, REBOL's series function use a generalization of
ordinal numbers, because in REBOL positions can be considered
both by "looking forward" and by "looking backward" from the
current series "index" (or maybe I should use the term
"cursor"?). The first element "looking forward" is represented
by the symbol 1st, while the first element "looking backward"
is represented by the symbol -1st. So the set of ordinal
numbers is actually for REBOL:
{... -3rd, -2nd, -1st, 1st, 2nd, 3rd, ...}
which REBOL represents using the subset of Z:
{... -3, -2, -1, 1, 2, 3, ...}
This set DOES NOT contain 0. So it is perfectly consistent for
PICK to fail on a second argument of 0, since 0 IS NOT an
ordinal number.
- Other languages do not really have a concept of "series" which
is a more general concept than that of vector or array; also,
other languages tend to use relative positioning of elements
inside vectors, while REBOL's series use absolute positioning
using ordinal numbers. You can't just say that absolute
positioning is wrong, while relative is right. (Note for
Ladislav: of course PICK and AT are not 0 based nor 1 based;
they do not use relative positioning!)
Also, REBOL allows relative positioning too, thru the function
SKIP. So, in the case where you really need a PICK function
that accepts an integer as its second argument (considering it
as a distance to the first element of the series) you can use:
my-pick: func [series offset] [pick skip series offset 1]
(Ok, I'll shut up now... this is already way too long!)
Not 0 based nor 1 based,
Gabriele.
--
Gabriele Santilli <[giesse--writeme--com]> - Amigan - REBOL programmer
Amiga Group Italia sez. L'Aquila -- http://www.amyresource.it/AGI/