GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Type-Predicates.html ・ emacs-doc.conao3.com

2.7 型述語

Emacs Lispインタプリタ自体は、関数呼び出し時に渡される実引数の型チェックを行いません。他のプログラミング言語とは異なり、Lispの関数引数には宣言されたデータ型が存在しないため、そのようなチェックは不可能です。したがって、各実引数がその関数で使用可能な型に属しているかどうかを判定するのは、個々の関数の役割となります。

すべての組み込み関数は、必要に応じて実引数の型をチェックし、引数の型が不適切な場合には wrong-type-argument エラーを発生させます。例えば、+ に処理できない引数を渡した場合、次のようなことが起こります:

(+ 2 'a)
     error→ Wrong type argument: number-or-marker-p, a

プログラムに異なる型をそれぞれ異なる方法で処理させたい場合は、明示的な型チェックを行う必要があります。オブジェクトの型をチェックする最も一般的な方法は、型述語関数を呼び出すことです。Emacsには、各型に対応する型述語のほか、型の組み合わせに対する述語もいくつか用意されています。

型述語関数は1つの引数を取り、その引数が適切な型に属する場合は t を、そうでない場合は nil を返します。述語関数に関する一般的な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

アトムを参照。

arrayp

arraypを参照してください。

bignump

bignumpを参照。

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

closurep

closurepを参照してください。

commandp

commandpを参照してください。

compiled-function-p

compiled-function-pを参照。

condition-variable-p

condition-variable-pを参照してください。

consp

conspを参照。

custom-variable-p

custom-variable-pを参照してください。

fixnump

fixnumpを参照。

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

interpreted-function-p

interpreted-function-pを参照。

keymapp

キーマップを参照してください。

keywordp

決して変わらない変数を参照してください。

listp

listpを参照。

markerp

markerpを参照。

mutexp

mutexpを参照してください。

nlistp

nlistpを参照。

number-or-marker-p

number-or-marker-pを参照。

numberp

numberpを参照。

obarrayp

obarraypを参照してください。

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 を呼び出すことです。各オブジェクトはただ一つのプリミティブ型に属することを思い出してください。type-of を使えば、それがどの型であるかが分かります(Lispのデータ型を参照)。しかし、type-of は非プリミティブ型については何も知りません。ほとんどの場合、type-of よりも型述語を使用する方が好ましいでしょう。

関数: type-of object

この関数は、object のプリミティブ型を示すシンボルを返します。値は、bool-vector、buffer、char-table、compiled-function、condition-variable、cons、finalizer、float、font-entity、font-object、font-spec、frame、hash-table、integer、marker、mutex、obarray、overlay、process、string、subr、symbol、thread、vector、window、または window-configuration のいずれかのシンボルです。ただし、object がレコードである場合は、その第1スロットで指定された型が返されます。レコード。

(type-of 1)
     ⇒ integer
(type-of 'nil)
     ⇒ symbol
(type-of '())    ; () is nil.
     ⇒ symbol
(type-of '(x))
     ⇒ cons
(type-of (record 'foo))
     ⇒ foo
関数: cl-type-of object

この関数は、objectの型を示すシンボルを返します。通常はtype-ofと同様に動作しますが、可能な限り最も精緻な型を返すことが保証されており、これは返される具体的な型がEmacsのバージョンによって変わる可能性があることも意味します。そのため、原則として、その戻り値を固定された型のセットと比較してはいけません。

(cl-type-of 1)
     ⇒ fixnum
(cl-type-of 'nil)
     ⇒ null
(cl-type-of (record 'foo))
     ⇒ foo