Next: Equality Predicates, Up: Predicates
Check if object is of type type, where type is a (quoted) type name of the sort used by Common Lisp. For example,
(cl-typep foo 'integer)
is equivalent to(integerp foo)
.
The type argument to the above function is either a symbol or a list beginning with a symbol.
t
stands for the union of all types.
(cl-typep
object t)
is always true. Likewise, the
type symbol nil
stands for nothing at all, and
(cl-typep
object nil)
is always false.
null
represents the symbol nil
.
Thus (cl-typep
object 'null)
is equivalent to
(null
object)
.
atom
represents all objects that are not cons
cells. Thus (cl-typep
object 'atom)
is equivalent to
(atom
object)
.
real
is a synonym for number
, and
fixnum
is a synonym for integer
.
character
and string-char
match
integers in the range from 0 to 255.
(integer
low high)
represents all
integers between low and high, inclusive. Either bound
may be a list of a single integer to specify an exclusive limit,
or a *
to specify no limit. The type (integer * *)
is thus equivalent to integer
.
float
, real
, or
number
represent numbers of that type falling in a particular
range.
and
, or
, and not
form
combinations of types. For example, (or integer (float 0 *))
represents all objects that are integers or non-negative floats.
member
or cl-member
represent
objects eql
to any of the following values. For example,
(member 1 2 3 4)
is equivalent to (integer 1 4)
,
and (member nil)
is equivalent to null
.
(satisfies
predicate)
represent
all objects for which predicate returns true when called
with that object as an argument.
The following function and macro (not technically predicates) are
related to cl-typep
.
This function attempts to convert object to the specified type. If object is already of that type as determined by
cl-typep
, it is simply returned. Otherwise, certain types of conversions will be made: If type is any sequence type (string
,list
, etc.) then object will be converted to that type if possible. If type ischaracter
, then strings of length one and symbols with one-character names can be coerced. If type isfloat
, then integers can be coerced in versions of Emacs that support floats. In all other circumstances,cl-coerce
signals an error.
This macro defines a new type called name. It is similar to
defmacro
in many ways; when name is encountered as a type name, the body forms are evaluated and should return a type specifier that is equivalent to the type. The arglist is a Common Lisp argument list of the sort accepted bycl-defmacro
. The type specifier ‘(name args...)’ is expanded by calling the expander with those arguments; the type symbol ‘name’ is expanded by calling the expander with no arguments. The arglist is processed the same as forcl-defmacro
except that optional arguments without explicit defaults use*
instead ofnil
as the “default” default. Some examples:(cl-deftype null () '(satisfies null)) ; predefined (cl-deftype list () '(or null cons)) ; predefined (cl-deftype unsigned-byte (&optional bits) (list 'integer 0 (if (eq bits '*) bits (1- (lsh 1 bits))))) (unsigned-byte 8) == (integer 0 255) (unsigned-byte) == (integer 0 *) unsigned-byte == (integer 0 *)The last example shows how the Common Lisp
unsigned-byte
type specifier could be implemented if desired; this package does not implementunsigned-byte
by default.
The cl-typecase
(see Conditionals) and cl-check-type
(see Assertions) macros also use type names. The cl-map
,
cl-concatenate
, and cl-merge
functions take type-name
arguments to specify the type of sequence to return. See Sequences.