Next: , Previous: , Up: Lispのデータ型   [Contents][Index]


2.7 型のための述語

関数が呼び出されたとき、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にputする
         (setq list (cons x list)))
        ((listp x)
         ;; Xがリストならその要素をLISTに追加
         (setq list (append x list)))
        (t
         ;; シンボルとリストだけを処理する
         (error "Invalid argument %s in add-on" x))))

以下のテーブルは事前定義された型述語(アルファベット順)と、さらに情報を得るためのリファレンスです。

atom

atomを参照のこと。

arrayp

arraypを参照のこと。

bignump

floatpを参照のこと。

bool-vector-p

bool-vector-pを参照のこと。

booleanp

booleanpを参照のこと。

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を参照のこと。

condition-variable-p

condition-variable-pを参照のこと。

consp

conspを参照のこと。

custom-variable-p

custom-variable-pを参照のこと。

fixnump

floatpを参照のこと。

floatp

floatpを参照のこと。

fontp

低レベルのフォント表現を参照のこと。

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

変更不可な変数を参照のこと。

listp

listpを参照のこと。

markerp

markerpを参照のこと。

mutexp

mutexpを参照のこと。

nlistp

nlistpを参照のこと。

number-or-marker-p

number-or-marker-pを参照のこと。

numberp

numberpを参照のこと。

overlayp

overlaypを参照のこと。

processp

processpを参照のこと。

recordp

recordpを参照のこと。

sequencep

sequencepを参照のこと。

string-or-null-p

string-or-null-pを参照のこと。

stringp

stringpを参照のこと。

subrp

subrpを参照のこと。

symbolp

symbolpを参照のこと。

syntax-table-p

syntax-table-pを参照のこと。

threadp

threadpを参照のこと。

vectorp

vectorpを参照のこと。

wholenump

wholenumpを参照のこと。

window-configuration-p

window-configuration-pを参照のこと。

window-live-p

window-live-pを参照のこと。

windowp

windowpを参照のこと。

あるオブジェクトがどの型かチェックするもっとも一般的な方法は、関数type-ofの呼び出しです。オブジェクトは、ただ1つだけの基本型に属することを思い出してください。type-ofは、それがどの型かを告げます(Lispのデータ型を参照)。しかしtype-ofは基本型以外の型については何も知りません。ほとんどの場合では、type-ofより型述語を使用するほうが便利でしょう。

Function: type-of object

この関数はobjectの基本型を名前とするシンボルをリターンする。リターン値はシンボルbool-vectorbufferchar-tablecompiled-functioncondition-variableconsfinalizerfloatfont-entityfont-objectfont-specframehash-tableintegermarkermutexoverlayprocessstringsubrsymbolthreadvectorwindowwindow-configurationのいずれか。ただしobjectがレコードなら最初のスロットで指定された型をリターンする。レコードを参照のこと。

(type-of 1)
     ⇒ integer
(type-of 'nil)
     ⇒ symbol
(type-of '())    ; ()nil
     ⇒ symbol
(type-of '(x))
     ⇒ cons
(type-of (record 'foo))
     ⇒ foo

Next: 同等性のための述語, Previous: 循環オブジェクトの読み取り構文, Up: Lispのデータ型   [Contents][Index]