CLパッケージはCommon Lispのtypep述語のある版を定義する。
objectが型typeかチェックする。typeはCommon Lisp
によって使われる(引用された)型名である。たとえば、
(typep foo 'integer)は(integerp foo)と同等である。
上の関数への引数typeはシンボルまたはシンボルで始まるリストである。
tはすべての型の和を表わす。
(typep object t)は常に真である。同様に、型シンボル
nilはまったくの空を表わし、 (typep object nil)は
常に偽である。
nullはシンボルnilを表わす。したがって、
(typep object 'null)は(null object)と同等で
ある。
realはnumberの同義語であり、fixnumは
integerの同義語である。
characterとstring-charは0から255までの範囲の
整数とマッチする。
floatはfloatpではなくこのパッケージで
定義された述語floatp-safeを使うので、浮動小数点サポートがない
版のEmacsでも正しく動作する。
(integer low high)はlow以上high
以下の全整数を表現する。どちらの範囲も、その値を含まない境界を指定する
単精度整数のリストか、無境界を指定する*でもよい。
型(integer * *)はしたがってintegerと同等である。
float、real、またはnumberで始まるリストは
特別の範囲に入る型の数を表現する。
and、or、そしてnotで始まるリストは型の結合を形成
する。たとえば、(or integer (float 0 *))は整数または
非負浮動小数点数であるすべてのオブジェクトを表現する。
memberまたはmember*で始まるリストは続く値のいずれかに
eqlであるオブジェクトを表現する。たとえば、
(member 1 2 3 4)は(integer 1 4)と同等であり、
(member nil)はnullと同等である。
(satisfies predicate)のリストは引数としてその
オブジェクトとともに呼び出されたときpredicateが真を返すすべての
オブジェクトを表現する。
下記の関数とマクロ(技術的には述語ではない)はtypepと関係がある。
この関数はobjectを指定されたtypeへ変換を試みる。
objectがすでにtypepで決定されるその型の場合、それは単純に
戻る。そうでなければ、ある変換型が作られる: typeがいずれかの
列型(string、list、その他)の場合、objectは
可能ならその型に変換される。typeがcharacterの場合、長さ
1の文字列や1文字の名前のシンボルは強制型変換できる。typeが
floatの場合、浮動小数点をサポートする版のEmacsでは整数は
強制型変換できる。その他すべての環境では、coerceはエラーを
通知する。
このマクロはnameと呼ばれる新しい型を定義する。それは多くの点で
defmacroと類似している; nameに型名として出会うと、本体
formsは評価され、その型と同等の型指定子を戻す。arglistは
defmacro*によって受け入れられる種類のCommon Lisp引数
リストである。型指定子‘(name args...)’はこれらの
引数とともにエクスパンダを呼び出すことで展開される; 型シンボル
‘name’は無引数でエクスパンダを呼び出すことで展開される。
明示的既定値のない付加引数は“default”既定値としてnilの
代わりに*を使うことを除いて、arglistはdefmacro*と
同様に処理される。いくつかの例:
(deftype null () '(satisfies null)) ; predefined (deftype list () '(or null cons)) ; predefined (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 *)
最後の例は望むならどのようにCommon Lisp unsigned-byte型指定子を
実装できるかを示す; このパッケージは既定ではunsigned-byteを実装
しない。
typecaseやcheck-typeマクロも型名を使う。
See 条件付き実行.See アサーション.map、
concatenate、そしてmerge関数は戻す列型を指定するために
型名引数をとる。See 列.