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 列.