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))))
以下の表は、事前定義された型述語(アルファベット順)と、さらに情報を得るためのリファレンスです。
atom
atomを参照してください。
arrayp
arraypを参照してください。
bool-vector-p
bool-vector-pを参照してください。
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を参照してください。
commandp
commandpを参照してください。
consp
conspを参照してください。
custom-variable-p
custom-variable-pを参照してください。
display-table-p
display-table-pを参照してください。
floatp
floatpを参照してください。
fontp
Low-Level Fontを参照してください。
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を参照してください。
keymapp
keymappを参照してください。
keywordp
Constant Variablesを参照してください。
listp
listpを参照してください。
markerp
markerpを参照してください。
wholenump
wholenumpを参照してください。
nlistp
nlistpを参照してください。
numberp
numberpを参照してください。
number-or-marker-p
number-or-marker-pを参照してください。
overlayp
overlaypを参照してください。
processp
processpを参照してください。
sequencep
sequencepを参照してください。
stringp
stringpを参照してください。
subrp
subrpを参照してください。
symbolp
symbolpを参照してください。
syntax-table-p
syntax-table-pを参照してください。
vectorp
vectorpを参照してください。
window-configuration-p
window-configuration-pを参照してください。
window-live-p
window-live-pを参照してください。
windowp
windowpを参照してください。
booleanp
booleanpを参照してください。
string-or-null-p
string-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]