Emacs Lispインタプリタ自体は、関数呼び出し時に渡される実引数の型チェックを行いません。他のプログラミング言語とは異なり、Lispの関数引数には宣言されたデータ型が存在しないため、そのようなチェックは不可能です。したがって、各実引数がその関数で使用可能な型に属しているかどうかを判定するのは、個々の関数の役割となります。
すべての組み込み関数は、必要に応じて実引数の型をチェックし、引数の型が不適切な場合には wrong-type-argument エラーを発生させます。例えば、+ に処理できない引数を渡した場合、次のようなことが起こります:
(+ 2 'a)
error→ Wrong type argument: number-or-marker-p, a
プログラムに異なる型をそれぞれ異なる方法で処理させたい場合は、明示的な型チェックを行う必要があります。オブジェクトの型をチェックする最も一般的な方法は、型述語関数を呼び出すことです。Emacsには、各型に対応する型述語のほか、型の組み合わせに対する述語もいくつか用意されています。
型述語関数は1つの引数を取り、その引数が適切な型に属する場合は t を、そうでない場合は nil を返します。述語関数に関する一般的なLispの慣習に従い、ほとんどの型述語の名前は
‘p’ で終わります。
ここでは、リストの有無を判定する述語 listp と、シンボルの有無を判定する述語 symbolp を使用した例を示します。
(defun add-on (x)
(cond ((symbolp x)
;; If X is a symbol, put it on LIST.
(setq list (cons x list)))
((listp x)
;; If X is a list, add its elements to LIST.
(setq list (append x list)))
(t
;; We handle only symbols and lists.
(error "Invalid argument %s in add-on" x))))
以下に、あらかじめ定義された型述語をアルファベット順に、詳細情報への参照とともにまとめた表を示します。
atomアトムを参照。
arrayparraypを参照してください。
bignumpbignumpを参照。
bool-vector-pbool-vector-pを参照。
booleanpbooleanpを参照。
bufferpbufferpを参照してください。
byte-code-function-pcase-table-pcase-table-pを参照。
char-or-string-pchar-or-string-pを参照。
char-table-pchar-table-pを参照。
closurepclosurepを参照してください。
commandpcommandpを参照してください。
compiled-function-pcondition-variable-pcondition-variable-pを参照してください。
conspconspを参照。
custom-variable-pcustom-variable-pを参照してください。
fixnumpfixnumpを参照。
floatpfloatpを参照。
fontp低レベルフォント表現を参照してください。
frame-configuration-pframe-configuration-pを参照してください。
frame-live-pframe-live-pを参照してください。
framepframepを参照。
functionpfunctionpを参照。
hash-table-phash-table-pを参照。
integer-or-marker-pintegerpintegerpを参照。
interpreted-function-pkeymappキーマップを参照してください。
keywordp決して変わらない変数を参照してください。
listplistpを参照。
markerpmarkerpを参照。
mutexpmutexpを参照してください。
nlistpnlistpを参照。
number-or-marker-pnumberpnumberpを参照。
obarraypobarraypを参照してください。
overlaypoverlaypを参照してください。
processpprocesspを参照。
recordprecordpを参照。
sequencepsequencepを参照してください。
string-or-null-pstring-or-null-pを参照してください。
stringpstringpを参照してください。
subrpsubrpを参照。
symbolpsymbolpを参照。
syntax-table-psyntax-table-pを参照してください。
threadpthreadpを参照してください。
vectorpvectorpを参照してください。
wholenumpwholenumpを参照。
window-configuration-pwindow-configuration-pを参照してください。
window-live-pwindow-live-pを参照してください。
windowpwindowpを参照してください。
オブジェクトの型を確認する最も一般的な方法は、関数 type-of
を呼び出すことです。各オブジェクトはただ一つのプリミティブ型に属することを思い出してください。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 がレコードである場合は、その第1スロットで指定された型が返されます。レコード。
(type-of 1)
⇒ integer
(type-of 'nil)
⇒ symbol
(type-of '()) ; () is 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