Next: , Previous: , Up: 述語   [Contents][Index]


3.1 データ型の述語

CLパッケージはCommon Lispのtypep述語のある版を定義する。

Function: typep object type

objectが型typeかチェックする。typeはCommon Lisp によって使われる(引用された)型名である。たとえば、 (typep foo 'integer)(integerp foo)と同等である。

上の関数への引数typeはシンボルまたはシンボルで始まるリストである。

下記の関数とマクロ(技術的には述語ではない)はtypepと関係がある。

Function: coerce object type

この関数はobjectを指定されたtypeへ変換を試みる。 objectがすでにtypepで決定されるその型の場合、それは単純に 戻る。そうでなければ、ある変換型が作られる: typeがいずれかの 列型(stringlist、その他)の場合、objectは 可能ならその型に変換される。typecharacterの場合、長さ 1の文字列や1文字の名前のシンボルは強制型変換できる。typefloatの場合、浮動小数点をサポートする版のEmacsでは整数は 強制型変換できる。その他すべての環境では、coerceはエラーを 通知する。

Special Form: deftype name arglist forms...

このマクロはnameと呼ばれる新しい型を定義する。それは多くの点で defmacroと類似している; nameに型名として出会うと、本体 formsは評価され、その型と同等の型指定子を戻す。arglistdefmacro*によって受け入れられる種類のCommon Lisp引数 リストである。型指定子‘(name args...)’はこれらの 引数とともにエクスパンダを呼び出すことで展開される; 型シンボル ‘name’は無引数でエクスパンダを呼び出すことで展開される。 明示的既定値のない付加引数は“default”既定値としてnilの 代わりに*を使うことを除いて、arglistdefmacro*と 同様に処理される。いくつかの例:

(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を実装 しない。

typecasecheck-typeマクロも型名を使う。 See 条件付き実行.See アサーション.mapconcatenate、そしてmerge関数は戻す列型を指定するために 型名引数をとる。See .