Common Lisp the Language, 2nd Edition
Next: Scope and Extent
Up: Data Types
Previous: Unreadable Data
Objects
The Common Lisp data type hierarchy is tangled and purposely left
somewhat open-ended so that implementors may experiment with new data
types as extensions to the language. This section explicitly states all
the defined relationships between types, including subtype/supertype
relationships, disjointness, and exhaustive partitioning. The user of
Common Lisp should not depend on any relationships not explicitly stated
here. For example, it is not valid to assume that because a number is
not complex and not rational that it must be a float
,
because implementations are permitted to provide yet other kinds of
numbers.
First we need some terminology. If x is a supertype of
y, then any object of type y is also of type
x, and y is said to be a subtype of x. If
types x and y are disjoint, then no object (in any
implementation) may be both of type x and of type y.
Types through
are an exhaustive union
of type x if each
is a subtype of x, and any object of type x is
necessarily of at least one of the types
;
through
are furthermore an exhaustive
partition if they are also pairwise disjoint.
t
is a supertype of every type whatsoever.
Every object is of type t
.nil
is a subtype of every type whatsoever. No
object is of type nil
.cons
, symbol
,
array
, number
, and character
are
pairwise disjoint.
X3J13 voted in June 1988 (DATA-TYPES-HIERARCHY-UNDERSPECIFIED) to
extend the preceding paragraph as follows.
cons
, symbol
,
array
, number
, character
,
hash-table
, readtable
, package
,
pathname
, stream
, random-state
,
and any single other type created by defstruct
or
defclass
are pairwise disjoint.The wording of the first edition was intended to allow implementors
to use the defstruct
facility to define the built-in types
hash-table
, readtable
, package
,
pathname
, stream
, random-state
.
The change still permits this implementation strategy but forbids these
built-in types from including, or being included in, other types (in the
sense of the defstruct
:include
option).
X3J13 voted in June 1988 (FUNCTION-TYPE) to specify that the type
function
is disjoint from the types cons
,
symbol
, array
, number
, and
character
. The type compiled-function
is a
subtype of function
; implementations are free to define
other subtypes of function
.
rational
, float
, and
complex
are pairwise disjoint subtypes of
number
.
X3J13 voted in March 1989 (REAL-NUMBER-TYPE) to rewrite the preceding
item as follows.
real
and complex
are pairwise
disjoint subtypes of number
.Rationale: It might be thought that
real
and complex
should form an exhaustive
partition of the type number
. This is purposely avoided
here in order to permit compatible experimentation with extensions to
the Common Lisp number system.
rational
and float
are pairwise
disjoint subtypes of real
.Rationale: It might be thought that
rational
and float
should form an exhaustive
partition of the type real
. This is purposely avoided here
in order to permit compatible experimentation with extensions to the
Common Lisp number system.
integer
and ratio
are disjoint
subtypes of rational
.Rationale: It might be thought that
integer
and ratio
should form an exhaustive
partition of the type rational
. This is purposely avoided
here in order to permit compatible experimentation with extensions to
the Common Lisp rational number system.
fixnum
and bignum
are disjoint
subtypes of integer
.Rationale: It might be thought that
fixnum
and bignum
should form an exhaustive
partition of the type integer
. This is purposely avoided
here in order to permit compatible experimentation with extensions to
the Common Lisp integer number system, such as the idea of adding
explicit representations of infinity or of positive and negative
infinity.
X3J13 voted in January 1989 (FIXNUM-NON-PORTABLE) to specify that the
types fixnum
and bignum
do in fact form an
exhaustive partition of the type integer
; more precisely,
they voted to specify that the type bignum
is by definition
equivalent to (and integer (not fixnum))
. This is
consistent with the first edition text in section 2.1.1.
I interpret this to mean that implementators could still experiment
with such extensions as adding explicit representations of infinity, but
such infinities would necessarily be of type bignum
.
short-float
, single-float
,
double-float
, and long-float
are subtypes of
float
. Any two of them must be either disjoint or
identical; if identical, then any other types between them in the above
ordering must also be identical to them (for example, if
single-float
and long-float
are identical
types, then double-float
must be identical to them
also).null
is a subtype of symbol
; the
only object of type null
is nil
.cons
and null
form an exhaustive
partition of the type list
.standard-char
is a subtype of
string-char
; string-char
is a subtype of
character
.
X3J13 voted in March 1989 (CHARACTER-PROPOSAL) to remove the type
string-char
. The preceding item is replaced by the
following.
standard-char
is a subtype of
base-character
. The types base-character
and
extended-character
form an exhaustive partition of
character
.string
is a subtype of vector
,
for string
means (vector string-char)
.
X3J13 voted in March 1989 (CHARACTER-PROPOSAL) to remove the type
string-char
. The preceding item is replaced by the
following.
string
is a subtype of vector
; it
is the union of all types
(vector
c
)
such that
c is a subtype of character
.bit-vector
is a subtype of
vector
, for bit-vector
means
(vector bit)
.(vector t)
, string
, and
bit-vector
are disjoint.vector
is a subtype of array
; for
all types x, the type
(vector
x
)
is the same as
the type
(array
x
(*))
.simple-array
is a subtype of
array
.simple-vector
, simple-string
,
and simple-bit-vector
are disjoint subtypes of
simple-array
, for they respectively mean
(simple-array t (*))
,
(simple-array string-char (*))
, and
(simple-array bit (*))
.
X3J13 voted in March 1989 (CHARACTER-PROPOSAL) to remove the type
string-char
. The preceding item is replaced by the
following.
simple-vector
, simple-string
,
and simple-bit-vector
are disjoint subtypes of
simple-array
, for they mean
(simple-array t (*))
, the union of all types
(simple-array
c
(*))
such
that c is a subtype of character
, and
(simple-array bit (*))
, respectively.simple-vector
is a subtype of
vector
and indeed is a subtype of
(vector t)
.simple-string
is a subtype of
string
. (Note that although string
is a
subtype of vector
, simple-string
is not a
subtype of simple-vector
.)Rationale: The hypothetical name
simple-general-vector
would have been more accurate than
simple-vector
, but in this instance euphony and user
convenience were deemed more important to the design of Common Lisp than
a rigid symmetry.
simple-bit-vector
is a subtype of
bit-vector
. (Note that although bit-vector
is
a subtype of vector
, simple-bit-vector
is not
a subtype of simple-vector
.)vector
and list
are disjoint
subtypes of sequence
.random-state
, readtable
,
package
, pathname
, stream
, and
hash-table
are pairwise disjoint.
X3J13 voted in June 1988 (DATA-TYPES-HIERARCHY-UNDERSPECIFIED) to make
random-state
, readtable
, package
,
pathname
, stream
, and hash-table
pairwise disjoint from a number of other types as well; see note
above.
X3J13 voted in January 1989 (STREAM-ACCESS) to introduce subtypes
of type stream
.
two-way-stream
, echo-stream
,
broadcast-stream
, file-stream
,
synonym-stream
, string-stream
, and
concatenated-stream
are disjoint subtypes of
stream
.defstruct
are disjoint unless
one is a supertype of the other by virtue of the :include
option.common
is formed by
the types cons
, symbol
,
(array
x
)
where
x is either t
or a subtype of common
,
string
, fixnum
, bignum
,
ratio
, short-float
, single-float
,
double-float
, long-float
,
(complex
x
)
where
x is a subtype of common
,
standard-char
, hash-table
,
readtable
, package
, pathname
,
stream
, random-state
, and all types created by
the user via defstruct
. An implementation may not
unilaterally add subtypes to common
; however, future
revisions to the Common Lisp standard may extend the definition of the
common
data type. Note that a type such as
number
or array
may or may not be a subtype of
common
, depending on whether or not the given
implementation has extended the set of objects of that type.
X3J13 voted in March 1989 (COMMON-TYPE) to remove the type
common
from the language.
Next: Scope and Extent
Up: Data Types
Previous: Unreadable Data
Objects
AI.Repository@cs.cmu.edu