Next: Equality Predicates, Previous: Circular Objects, Up: Lisp Data Types [Contents][Index]
Emacs Lispインタープリター自身は、関数が呼び出されたときに、その関数に渡された実際の引数にたいする型チェックは行ないません。それが行なえないのは、Lispにおける関数の引数は、他のプログラミング言語のようなデータ型宣言をもたないからです。したがって実際の引数が、その関数が使用できる型に属するかどうかをテストするのは、それぞれの関数に任されています。
すべてのビルトイン関数は、適切なときに実際の引数の型チェックを行い、引数の型が違う場合は、wrong-type-argumentエラーをシグナルします。たとえば以下は、+の引数に、+が扱うことができない引数を渡したとき何が起こるかの例です:
(+ 2 'a)
error→ Wrong type argument: number-or-marker-p, a
異なる型にたいして異なる処理をプログラムに行なわせる場合は、明示的に型チェックを行なわなければなりません。オブジェクトの型をチェックするもっとも一般的な方法は、型述語(type predicate)関数の呼び出しです。Emacsはそれぞれの型にたいする型述語をもち、組み合わされた型にたいする述語もあります。
型述語関数は1つの引数をとり、その引数が適切な型であればt、そうでない場合はnilをreturnします。述語関数にたいする一般的な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))))
以下の表は、事前定義された型述語(アルファベット順)と、さらに情報を得るためのリファレンスです。
atomatomを参照してください。
arrayparraypを参照してください。
bool-vector-pbool-vector-pを参照してください。
bufferpbufferpを参照してください。
byte-code-function-pbyte-code-function-pを参照してください。
case-table-pcase-table-pを参照してください。
char-or-string-pchar-or-string-pを参照してください。
char-table-pchar-table-pを参照してください。
commandpcommandpを参照してください。
conspconspを参照してください。
custom-variable-pcustom-variable-pを参照してください。
display-table-pdisplay-table-pを参照してください。
floatpfloatpを参照してください。
fontpLow-Level Fontを参照してください。
frame-configuration-pframe-configuration-pを参照してください。
frame-live-pframe-live-pを参照してください。
framepframepを参照してください。
functionpfunctionpを参照してください。
hash-table-phash-table-pを参照してください。
integer-or-marker-pinteger-or-marker-pを参照してください。
integerpintegerpを参照してください。
keymappkeymappを参照してください。
keywordpConstant Variablesを参照してください。
listplistpを参照してください。
markerpmarkerpを参照してください。
wholenumpwholenumpを参照してください。
nlistpnlistpを参照してください。
numberpnumberpを参照してください。
number-or-marker-pnumber-or-marker-pを参照してください。
overlaypoverlaypを参照してください。
processpprocesspを参照してください。
sequencepsequencepを参照してください。
stringpstringpを参照してください。
subrpsubrpを参照してください。
symbolpsymbolpを参照してください。
syntax-table-psyntax-table-pを参照してください。
vectorpvectorpを参照してください。
window-configuration-pwindow-configuration-pを参照してください。
window-live-pwindow-live-pを参照してください。
windowpwindowpを参照してください。
booleanpbooleanpを参照してください。
string-or-null-pstring-or-null-pを参照してください。
あるオブジェクトがどの型かチェックするもっとも一般的な方法は、関数type-ofの呼び出しです。オブジェクトは、ただ1つだけの基本型に属することを思い出してください。type-ofは、それがどの型(Lisp Data Typesを参照してください)か告げます。しかしtype-ofは基本型以外の型については何も知りません。ほとんどの場合、type-ofより型述語を使用するほうが便利でしょう。
この関数はobjectの基本型を名前とする、シンボルをreturnします。retuen値はシンボルbool-vector、buffer、char-table、compiled-function、cons、float、font-entity、font-object、font-spec、frame、hash-table、integer、marker、overlay、process、string、subr、symbol、vector、window、window-configurationのうちの1つです。
(type-of 1)
⇒ integer
(type-of 'nil)
⇒ symbol
(type-of '()) ; ()はnilです。
⇒ symbol
(type-of '(x))
⇒ cons
Next: Equality Predicates, Previous: Circular Objects, Up: Lisp Data Types [Contents][Index]