% -*- Mode: TeX -*- \beginsubsection{Array Elements} \DefineSection{ArrayElements} An \term{array} contains a set of \term{objects} called \term{elements} that can be referenced individually according to a rectilinear coordinate system. \beginsubsubsection{Array Indices} %% 2.5.0 5 An \term{array} \term{element} is referred to by a (possibly empty) series of indices. The length of the series must equal the \term{rank} of the \term{array}. \issue{ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM} Each index must be a non-negative \term{fixnum} \endissue{ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM} %strictly less than the corresponding \term{array} \term{dimension}. \term{Array} indexing is zero-origin. \endsubsubsection%{Array Indices} \beginsubsubsection{Array Dimensions} An axis of an \term{array} is called a \newterm{dimension}. Each \term{dimension} is a non-negative \issue{ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM} \term{fixnum}; \endissue{ARRAY-DIMENSION-LIMIT-IMPLICATIONS:ALL-FIXNUM} if any dimension of an \term{array} is zero, the \term{array} has no elements. % Maybe this part isn't in glossary...I just moved it from somewhere else per % suggestion of Barmar. -kmp 14-Jan-92 It is permissible for a \term{dimension} to be zero, in which case the \term{array} has no elements, and any attempt to \term{access} an \term{element} is an error. However, other properties of the \term{array}, such as the \term{dimensions} themselves, may be used. \beginsubsubsubsection{Implementation Limits on Individual Array Dimensions} An \term{implementation} may impose a limit on \term{dimensions} of an \term{array}, but there is a minimum requirement on that limit. \Seevar{array-dimension-limit}. \endsubsubsubsection%{Implementation Limits on Individual Array Dimensions} \endsubsubsection%{Array Dimensions} \beginsubsubsection{Array Rank} %% 2.5.0 3 %% 2.5.0 4 An \term{array} can have any number of \term{dimensions} (including zero). The number of \term{dimensions} is called the \newterm{rank}. If the rank of an \term{array} is zero then the \term{array} is said to have no \term{dimensions}, and the product of the dimensions (see \funref{array-total-size}) is then 1; a zero-rank \term{array} therefore has a single element. \beginsubsubsubsection{Vectors} An \term{array} of \term{rank} one (\ie a one-dimensional \term{array}) is called a \newterm{vector}. \beginsubsubsubsubsection{Fill Pointers} A \newterm{fill pointer} is a non-negative \term{integer} no larger than the total number of \term{elements} in a \term{vector}. Not all \term{vectors} have \term{fill pointers}. \Seefuns{make-array} and \funref{adjust-array}. An \term{element} of a \term{vector} is said to be \newterm{active} if it has an index that is greater than or equal to zero, but less than the \term{fill pointer} (if any). For an \term{array} that has no \term{fill pointer}, all \term{elements} are considered \term{active}. %% 17.5.0 4 Only \term{vectors} may have \term{fill pointers}; multidimensional \term{arrays} may not. A multidimensional \term{array} that is displaced to a \term{vector} that has a \term{fill pointer} can be created. \endsubsubsubsubsection%{Fill Pointers} \endsubsubsubsection%{Vectors} \beginsubsubsubsection{Multidimensional Arrays} \beginsubsubsubsubsection{Storage Layout for Multidimensional Arrays} %% 2.5.0 8 Multidimensional \term{arrays} store their components in row-major order; that is, internally a multidimensional \term{array} is stored as a one-dimensional \term{array}, with the multidimensional index sets ordered lexicographically, last index varying fastest. \endsubsubsubsubsection%{Storage Layout for Multidimensional Arrays} \beginsubsubsubsubsection{Implementation Limits on Array Rank} An \term{implementation} may impose a limit on the \term{rank} of an \term{array}, but there is a minimum requirement on that limit. \Seevar{array-rank-limit}. \endsubsubsubsubsection%{Implementation Limits on Array Rank} \endsubsubsubsection%{Multidimensional Arrays} \endsubsubsection%{Array Rank} \endsubsection%{Array Elements} \beginsubsection{Specialized Arrays} %% 17.0.0 4 An \term{array} can be a \term{general} \term{array}, meaning each \term{element} may be any \term{object}, or it may be a \term{specialized} \term{array}, meaning that each \term{element} must be of a restricted \term{type}. The phrasing ``an \term{array} \term{specialized} to \term{type} \metavar{type}'' is sometimes used to emphasize the \term{element type} of an \term{array}. This phrasing is tolerated even when the \metavar{type} is \typeref{t}, even though an \term{array} \term{specialized} to \term{type} \term{t} is a \term{general} \term{array}, not a \term{specialized} \term{array}. \Thenextfigure\ lists some \term{defined names} that are applicable to \term{array} creation, \term{access}, and information operations. %% Added ARRAY-DISPLACEMENT per Tom Shepard. (X3J13 approved: May 4-5, 1994) %% -kmp 9-May-94 \displaythree{General Purpose Array-Related Defined Names}{ adjust-array&array-has-fill-pointer-p&make-array\cr adjustable-array-p&array-in-bounds-p&svref\cr aref&array-rank&upgraded-array-element-type\cr array-dimension&array-rank-limit&upgraded-complex-part-type\cr array-dimension-limit&array-row-major-index&vector\cr array-dimensions&array-total-size&vector-pop\cr array-displacement&array-total-size-limit&vector-push\cr array-element-type&fill-pointer&vector-push-extend\cr } \beginsubsubsection{Array Upgrading} \DefineSection{ArrayUpgrading} \issue{ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING} % Some of the following was transplanted from the description % of UPGRADED-ARRAY-ELEMENT-TYPE. Consider also stealing from % SUBTYPEP and TYPEP. The \newterm{upgraded array element type} of a \term{type} $T\sub 1$ is a \term{type} $T\sub 2$ that is a \term{supertype} of $T\sub 1$ and that is used instead of $T\sub 1$ whenever $T\sub 1$ is used as an \term{array element type} for object creation or type discrimination. During creation of an \term{array}, the \term{element type} that was requested is called the \newterm{expressed array element type}. The \term{upgraded array element type} of the \term{expressed array element type} becomes the \newterm{actual array element type} of the \term{array} that is created. %!!! Barmar thinks this should be removed. \term{Type} \term{upgrading} implies a movement upwards in the type hierarchy lattice. A \term{type} is always a \term{subtype} of its \term{upgraded array element type}. Also, if a \term{type} $T\sub x$ is a \term{subtype} of another \term{type} $T\sub y$, then the \term{upgraded array element type} of $T\sub x$ must be a \term{subtype} of the \term{upgraded array element type} of $T\sub y$. Two \term{disjoint} \term{types} can be \term{upgraded} to the same \term{type}. The \term{upgraded array element type} $T\sub 2$ of a \term{type} $T\sub 1$ is a function only of $T\sub 1$ itself; that is, it is independent of any other property of the \term{array} for which $T\sub 2$ will be used, such as \term{rank}, \term{adjustability}, \term{fill pointers}, or displacement. %% This next sentence is interesting, but is just Rationale, so is omitted. % The reason \term{rank} is included is because it would not % be consistently possible to displace \term{arrays} to those of differing % \term{rank} otherwise. \Thefunction{upgraded-array-element-type} can be used by \term{conforming programs} to predict how the \term{implementation} will \term{upgrade} a given \term{type}. \endissue{ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING} \endsubsubsection%{Array Upgrading} \beginsubsubsection{Required Kinds of Specialized Arrays} \DefineSection{RequiredSpecializedArrays} %% 17.0.0 5 \term{Vectors} whose \term{elements} are restricted to \term{type} \issue{CHARACTER-PROPOSAL:2-3-2} \typeref{character} or a \term{subtype} of \typeref{character} \endissue{CHARACTER-PROPOSAL:2-3-2} are called \newtermidx{strings}{string}. \term{Strings} are \oftype{string}. %% 18.0.0 7 %% 18.0.0 4 \Thenextfigure\ lists some \term{defined names} related to \term{strings}. \term{Strings} are \term{specialized} \term{arrays} and might logically have been included in this chapter. However, for purposes of readability most information about \term{strings} does not appear in this chapter; see instead \chapref\Strings. %% 18.0.0 5 %% paragraph duplicated in descriptions of string-equal and string= %% 18.0.0 6 %% paragraph duplicated in description of stringp \displaythree{Operators that Manipulate Strings}{ char&string-equal&string-upcase\cr make-string&string-greaterp&string{\tt /=}\cr nstring-capitalize&string-left-trim&string{\tt <}\cr nstring-downcase&string-lessp&string{\tt <=}\cr nstring-upcase&string-not-equal&string{\tt =}\cr schar&string-not-greaterp&string{\tt >}\cr string&string-not-lessp&string{\tt >=}\cr string-capitalize&string-right-trim&\cr string-downcase&string-trim&\cr } \term{Vectors} whose \term{elements} are restricted to \term{type} \typeref{bit} are called \newtermidx{bit vectors}{bit vector}. \term{Bit vectors} are \oftype{bit-vector}. \Thenextfigure\ lists some \term{defined names} for operations on \term{bit arrays}. \displaythree{Operators that Manipulate Bit Arrays}{ bit&bit-ior&bit-orc2\cr bit-and&bit-nand&bit-xor\cr bit-andc1&bit-nor&sbit\cr bit-andc2&bit-not&\cr bit-eqv&bit-orc1&\cr } \endsubsubsection%{Required Kinds of Specialized Arrays} \endsubsection%{Specialized Arrays}