Next: message, Previous: Variable Number of Arguments, Up: Arguments [Contents][Index]
ある関数に間違ったタイプ(wrong
type)の引数が渡されると、Lispインタープリターがエラーメッセージを生成します。たとえば関数+は自身にたいする引数の値として数値を期待します。試しに数値ではなくクォートしたシンボルhelloを与えてみましょう。以下の式の後にカーソルを移動してC-x
C-eをタイプしてください:
(+ 2 'hello)
これを行うことによってエラーメッセージが生成されるはずです。何が起こったのでしょう。+は2にたいして'helloがリターンした値を加えようとしましたが、'helloがリターンしたのは数値ではなくシンボルhelloでした。加算できるのは数値だけです。したがって+は加算を行うことができなかったのです。
これによって以下が表示された*Backtrace*バッファーに遷移するはずです:
---------- Buffer: *Backtrace* ----------
Debugger entered--Lisp error:
(wrong-type-argument number-or-marker-p hello)
+(2 hello)
eval((+ 2 'hello) nil)
elisp--eval-last-sexp(t)
eval-last-sexp(nil)
funcall-interactively(eval-print-last-sexp nil)
call-interactively(eval-print-last-sexp nil nil)
command-execute(eval-print-last-sexp)
---------- Buffer: *Backtrace* ----------
いつもと同様にエラーメッセージは手掛かりを与えるよう努めたものであり、メッセージを読むコツを学んだ後なら理解できるでしょう4。
このエラーメッセージの最初の部分は単純明快に‘wrong type
argument’と告げています。次に‘number-or-marker-p’という謎の専門用語が続きます。これは+が期待する引数の種類を伝えようとしている用語です。
シンボルnumber-or-marker-pは与えられた情報(引数の値)が数値かマーカー(バッファー位置を示すための特別なオブジェクト)かどうかの判別をLispインタープリターが試みたことを伝えるもので、+が加算するために与えられたのが数値かどうか、さらに引数がEmacs固有機能であるマーカーと呼ばれるものであるかどうかもテストします(Emacsではバッファー内の位置はマーカーとして記録されます;
C-@やC-SPCのようなコマンドでマーカーがセットされると、その位置がマーカーとして保存されます;
このマーカーは数値とみなすことができます。位置とはバッファー先頭からの文字数だからです)。Emacs
Lispの+はマーカーの数としての値を数値として加算できるのです。
number-or-marker-pの‘p’は、Lispプログラミングの初期に始まった慣習の実践例です。predicate(述語)が‘p’の由来です。黎明期のLisp研究者が使用していた専門用語において、何らかのプロパティの真偽を判定する関数を示すために述語という用語が使用されていました。したがってこの‘p’は、number-or-marker-pについて与えられた引数が数値かマーカーであるかの真偽を判定する関数の名前であることを教えてくれます。
そしてエラーメッセージの最後の部分がシンボルhelloです。これは+に渡された引数の値です。この加算にたいしてhelloのようなシンボルではなく、数値のように適正なタイプのオブジェクトが渡された場合には37のような値になるでしょう。それならこのエラーメッセージうぃ受け取ることはないはずです。