Next: Equality Predicates, Previous: Editing Types, Up: Lisp Data Types
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に加える (setq list (cons x list))) ((listp x) ;; Xがリストならば、その要素をLISTに追加する (setq list (append x list))) (t ;; シンボルとリストだけを扱う (error "Invalid argument %s in add-on" x))))
定義済みの型述語を、アルファベット順に、参照先を併記してあげておきます。
atom
arrayp
bool-vector-p
bufferp
byte-code-function-p
case-table-p
char-or-string-p
char-table-p
commandp
consp
display-table-p
floatp
frame-configuration-p
frame-live-p
framep
functionp
integer-or-marker-p
integerp
keymapp
listp
markerp
wholenump
nlistp
numberp
number-or-marker-p
overlayp
processp
sequencep
stringp
subrp
symbolp
syntax-table-p
user-variable-p
vectorp
window-configuration-p
window-live-p
windowp
オブジェクトの型を調べるもっとも一般的な方法は、
関数type-of
を呼び出すことです。
各オブジェクトはたった1つの基本型に属することを思い出してください。
type-of
はどの1つかを教えてくれます(see Lisp Data Types)。
しかし、type-of
は、基本型以外についてはなにも知りません。
多くの場合、type-of
より型述語を使うほうが便利でしょう。
この関数は、objectの基本型を示すシンボルを返す。 その値は、
symbol
、integer
、float
、string
、cons
、vector
、char-table
、bool-vector
、subr
、compiled-function
、marker
、overlay
、window
、buffer
、frame
、process
、window-configuration
の シンボルのうちの1つ。(type-of 1) integer (type-of 'nil) symbol (type-of '()) ;()
はnil
symbol (type-of '(x)) cons