関数が呼び出されたとき、Emacs Lispインタープリター自身はその関数に渡された実際の引数の型チェックは行ないません。それが行なえないのは、Lispにおける関数の引数は他のプログラミング言語のようなデータ型宣言をもたないからです。したがって実際の引数が、その関数が使用できる型に属するかどうかをテストするのは、それぞれの関数に任されています。
すべてのビルトイン関数は適切なときに実際の引数の型チェックを行い、引数の型が違う場合はwrong-type-argument
エラーをシグナルします。たとえば以下は、+
の引数に+
が扱うことができない引数を渡したとき何が起こるかの例です:
(+ 2 'a) error→ Wrong type argument: number-or-marker-p, a
異なる型にたいして異なる処理をプログラムに行なわせる場合は、明示的に型チェックを行なわなければなりません。オブジェクトの型をチェックするもっとも一般的な方法は型述語(type predicate)関数の呼び出しです。Emacsはそれぞれの型にたいする型述語をもち、組み合わされた型にたいする述語もあります。
型述語関数は1つの引数をとり、その引数が適切な型であればt
、そうでなければnil
をリターンします。述語関数にたいする一般的なLisp慣習にしたがい、ほとんどの型述語の名前は‘p’で終わります。
以下はリストにたいしてチェックを行なう述語listp
と、シンボルにたいしてチェックを行なう述語symbolp
の例です。
(defun add-on (x) (cond ((symbolp x) ;; XがシンボルならLISTにputする (setq list (cons x list))) ((listp x) ;; Xがリストならその要素をLISTに追加 (setq list (append x list))) (t ;; シンボルとリストだけを処理する (error "Invalid argument %s in add-on" x))))
以下のテーブルは事前定義された型述語(アルファベット順)と、さらに情報を得るためのリファレンスです。
atom
atomを参照のこと。
arrayp
arraypを参照のこと。
bignump
bignumpを参照のこと。
bool-vector-p
bool-vector-pを参照のこと。
booleanp
booleanpを参照のこと。
bufferp
bufferpを参照のこと。
byte-code-function-p
byte-code-function-pを参照のこと。
case-table-p
case-table-pを参照のこと。
char-or-string-p
char-or-string-pを参照のこと。
char-table-p
char-table-pを参照のこと。
closurep
closurepを参照のこと。
commandp
commandpを参照のこと。
compiled-function-p
compiled-function-pを参照のこと。
condition-variable-p
condition-variable-pを参照のこと。
consp
conspを参照のこと。
custom-variable-p
custom-variable-pを参照のこと。
fixnump
fixnumpを参照のこと。
floatp
floatpを参照のこと。
fontp
低レベルのフォント表現を参照のこと。
frame-configuration-p
frame-configuration-pを参照のこと。
frame-live-p
frame-live-pを参照のこと。
framep
framepを参照のこと。
functionp
functionpを参照のこと。
hash-table-p
hash-table-pを参照のこと。
integer-or-marker-p
integer-or-marker-pを参照のこと。
integerp
integerpを参照のこと。
interpreted-function-p
interpreted-function-pを参照のこと。
keymapp
keymappを参照のこと。
keywordp
変更不可な変数を参照のこと。
listp
listpを参照のこと。
markerp
markerpを参照のこと。
mutexp
mutexpを参照のこと。
nlistp
nlistpを参照のこと。
number-or-marker-p
number-or-marker-pを参照のこと。
numberp
numberpを参照のこと。
obarrayp
obarraypを参照のこと。
overlayp
overlaypを参照のこと。
processp
processpを参照のこと。
recordp
recordpを参照のこと。
sequencep
sequencepを参照のこと。
string-or-null-p
string-or-null-pを参照のこと。
stringp
stringpを参照のこと。
subrp
subrpを参照のこと。
symbolp
symbolpを参照のこと。
syntax-table-p
syntax-table-pを参照のこと。
threadp
threadpを参照のこと。
vectorp
vectorpを参照のこと。
wholenump
wholenumpを参照のこと。
window-configuration-p
window-configuration-pを参照のこと。
window-live-p
window-live-pを参照のこと。
windowp
windowpを参照のこと。
あるオブジェクトがどの型かチェックするもっとも一般的な方法は、関数type-of
の呼び出しです。オブジェクトは、ただ1つだけの基本型に属することを思い出してください。type-of
は、それがどの型かを告げます(Lispのデータ型を参照)。しかしtype-of
は基本型以外の型については何も知りません。ほとんどの場合では、type-of
より型述語を使用するほうが好ましいでしょう。
この関数はobjectの基本型を名前とするシンボルをリターンする。リターン値はシンボルbool-vector
、buffer
、char-table
、compiled-function
、condition-variable
、cons
、finalizer
、float
、font-entity
、font-object
、font-spec
、frame
、hash-table
、integer
、marker
、mutex
、obarray
、overlay
、process
、string
、subr
、symbol
、thread
、vector
、window
、window-configuration
のいずれか。ただしobjectがレコードなら最初のスロットで指定された型をリターンする。レコードを参照のこと。
(type-of 1) ⇒ integer
(type-of 'nil)
⇒ symbol
(type-of '()) ; ()
はnil
⇒ symbol
(type-of '(x))
⇒ cons
(type-of (record 'foo))
⇒ foo
この関数はobjectのタイプ名を命名するシンボルをリターンする。通常はtype-of
のように振る舞うが、可能なかぎりもっとも正確なタイプをリターンすることを保証する点が異なる。これは関数によりリターンされる固有のタイプが、Emacsのバージョンに応じて異なるかもしれないことを暗に含む。この理由により、原則としてある固定されたタイプセットとこの関数のリターン値を比較してはならない。
(cl-type-of 1) ⇒ fixnum
(cl-type-of 'nil) ⇒ null (cl-type-of (record 'foo)) ⇒ foo