#### 5.6.7 Arrays

Arrays are a collection of cells organized into an arbitrary
number of dimensions. Each cell can be accessed in constant time by
supplying an index for each dimension.

In the current implementation, an array uses a generalized vector for
the actual storage of its elements. Any kind of generalized vector
will do, so you can have arrays of uniform numeric values, arrays of
characters, arrays of bits, and of course, arrays of arbitrary Scheme
values. For example, arrays with an underlying `c64vector`

might
be nice for digital signal processing, while arrays made from a
`u8vector`

might be used to hold gray-scale images.

The number of dimensions of an array is called its rank. Thus,
a matrix is an array of rank 2, while a vector has rank 1. When
accessing an array element, you have to specify one exact integer for
each dimension. These integers are called the indices of the
element. An array specifies the allowed range of indices for each
dimension via an inclusive lower and upper bound. These bounds can
well be negative, but the upper bound must be greater than or equal to
the lower bound minus one. When all lower bounds of an array are
zero, it is called a zero-origin array.

Arrays can be of rank 0, which could be interpreted as a scalar.
Thus, a zero-rank array can store exactly one object and the list of
indices of this element is the empty list.

Arrays contain zero elements when one of their dimensions has a zero
length. These empty arrays maintain information about their shape: a
matrix with zero columns and 3 rows is different from a matrix with 3
columns and zero rows, which again is different from a vector of
length zero.

Generalized vectors, such as strings, uniform numeric vectors, bit
vectors and ordinary vectors, are the special case of one dimensional
arrays.