次: Equality Predicates, 前: Editing Types, 上: 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))))
定義済みの型述語を、アルファベット順に、参照先を併記してあげておきます。
atomarraypbool-vector-pbufferpbyte-code-function-pcase-table-pchar-or-string-pchar-table-pcommandpconspdisplay-table-pfloatpframe-configuration-pframe-live-pframepfunctionpinteger-or-marker-pintegerpkeymapplistpmarkerpwholenumpnlistpnumberpnumber-or-marker-poverlaypprocesspsequencepstringpsubrpsymbolpsyntax-table-puser-variable-pvectorpwindow-configuration-pwindow-live-pwindowpオブジェクトの型を調べるもっとも一般的な方法は、
関数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