値がバインドされていないシンボルを評価しようとすると、エラーメッセージが表示されます。これは、2 + 2
の加算を例に試してみることで確認できます。以下の式において、+ の直後、最初の数値 2
の前にカーソルを置き、C-x C-e と入力してください:
(+ 2 2)
GNU Emacs 22では、次のような内容の*Backtrace*バッファを作成します:
---------- Buffer: *Backtrace* ---------- Debugger entered--Lisp error: (void-variable +) eval(+ nil) elisp--eval-last-sexp(nil) #f(compiled-function () #<bytecode ...>)() handler-bind-1(#f(compiled-function () #<bytecode ...>) (error) eval-expression--debug) eval-last-sexp(nil) funcall-interactively(eval-last-sexp nil) call-interactively(eval-last-sexp nil nil) command-execute(eval-last-sexp) ---------- Buffer: *Backtrace* ----------
(なお、*Backtrace*バッファにqと入力することで、デバッガを終了できます。)
このバックトレースは、最初に見た「Debugger entered--Lisp error: (void-function this)」というエラーメッセージとは異なります。今回のケースでは、関数が変数として値を持っていません。一方、もう一方のエラーメッセージでは、関数(「this」という文字列)に定義がありませんでした。
この+を用いた実験で行ったことは、Lispインタプリタに+を評価させ、関数定義ではなく変数の値を探させることでした。具体的には、前回のように囲みリストの括弧の後ではなく、シンボルの直後にカーソルを配置することでこれを実現しました。その結果、Lispインタプリタは直前のs式を評価しましたが、この場合は+単体でした。
+
には値がバインドされておらず、関数定義のみであったため、エラーメッセージには変数としてのシンボルの値が void であると報告されました。