Previous: Type Relationships, Up: Types
Type specifiers can be symbols, classes, or lists. Figure~4–2 lists symbols that are standardized atomic type specifiers, and Figure~4–3 lists standardized compound type specifier names. For syntax information, see the dictionary entry for the corresponding type specifier. It is possible to define new type specifiers using defclass, define-condition, defstruct, or deftype.
arithmetic-error function simple-condition
array generic-function simple-error
atom hash-table simple-string
base-char integer simple-type-error
base-string keyword simple-vector
bignum list simple-warning
bit logical-pathname single-float
bit-vector long-float standard-char
broadcast-stream method standard-class
built-in-class method-combination standard-generic-function
cell-error nil standard-method
character null standard-object
class number storage-condition
compiled-function package stream
complex package-error stream-error
concatenated-stream parse-error string
condition pathname string-stream
cons print-not-readable structure-class
control-error program-error structure-object
division-by-zero random-state style-warning
double-float ratio symbol
echo-stream rational synonym-stream
end-of-file reader-error t
error readtable two-way-stream
extended-char real type-error
file-error restart unbound-slot
file-stream sequence unbound-variable
fixnum serious-condition undefined-function
float short-float unsigned-byte
floating-point-inexact signed-byte vector
floating-point-invalid-operation simple-array warning
floating-point-overflow simple-base-string
floating-point-underflow simple-bit-vector
Figure 4–2: Standardized Atomic Type Specifiers
\indent If a type specifier is a list, the car of the list is a symbol, and the rest of the list is subsidiary type information. Such a type specifier is called a compound type specifier . Except as explicitly stated otherwise, the subsidiary items can be unspecified. The unspecified subsidiary items are indicated by writing *. For example, to completely specify a vector, the type of the elements and the length of the vector must be present.
(vector double-float 100)
The following leaves the length unspecified:
(vector double-float *)
The following leaves the element type unspecified:
(vector * 100)
Suppose that two type specifiers are the same except that the first has a * where the second has a more explicit specification. Then the second denotes a subtype of the type denoted by the first.
If a list has one or more unspecified items at the end, those items can be dropped. If dropping all occurrences of * results in a singleton list, then the parentheses can be dropped as well (the list can be replaced by the symbol in its car). For example, (vector double-float *) can be abbreviated to (vector double-float), and (vector * *) can be abbreviated to (vector) and then to vector.
and long-float simple-base-string array member simple-bit-vector base-string mod simple-string bit-vector not simple-vector complex or single-float cons rational string double-float real unsigned-byte eql satisfies values float short-float vector function signed-byte integer simple-array Figure 4–3: Standardized Compound Type Specifier Names
Figure 4–4 show the defined names that can be used as compound type specifier names but that cannot be used as atomic type specifiers.
and mod satisfies eql not values member or Figure 4–4: Standardized Compound-Only Type Specifier Names
New type specifiers can come into existence in two ways.
Defining a structure by using defstruct without using the :type specifier or defining a class by using defclass or define-condition automatically causes the name of the structure or class to be a new type specifier symbol.
deftype can be used to define derived type specifiers , which act as ‘abbreviations’ for other type specifiers.
A class object can be used as a type specifier. When used this way, it denotes the set of all members of that class.
Figure 4–5 shows some defined names relating to types and declarations.
coerce defstruct subtypep declaim deftype the declare ftype type defclass locally type-of define-condition proclaim typep Figure 4–5: Defined names relating to types and declarations.
Figure 4–6 shows all defined names that are type specifier names, whether for atomic type specifiers or compound type specifiers; this list is the union of the lists in Figure~4–2 and Figure~4–3.
and function simple-array
arithmetic-error generic-function simple-base-string
array hash-table simple-bit-vector
atom integer simple-condition
base-char keyword simple-error
base-string list simple-string
bignum logical-pathname simple-type-error
bit long-float simple-vector
bit-vector member simple-warning
broadcast-stream method single-float
built-in-class method-combination standard-char
cell-error mod standard-class
character nil standard-generic-function
class not standard-method
compiled-function null standard-object
complex number storage-condition
concatenated-stream or stream
condition package stream-error
cons package-error string
control-error parse-error string-stream
division-by-zero pathname structure-class
double-float print-not-readable structure-object
echo-stream program-error style-warning
end-of-file random-state symbol
eql ratio synonym-stream
error rational t
extended-char reader-error two-way-stream
file-error readtable type-error
file-stream real unbound-slot
fixnum restart unbound-variable
float satisfies undefined-function
floating-point-inexact sequence unsigned-byte
floating-point-invalid-operation serious-condition values
floating-point-overflow short-float vector
floating-point-underflow signed-byte warning
Figure 4–6: Standardized Type Specifier Names
Previous: Type Relationships, Up: Types