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

17.1 debug

1から指定された数値までの合計を返すことを目的とした関数定義を記述したとします。(これは前述のtriangle関数です。解説についてはデクリメントカウンタの例を参照してください。)

ただし、関数の定義にバグがあります。‘1-’ を ‘1=’ と打ち間違えています。誤った定義は以下の通りです:

(defun triangle-bugged (number)
  "Return sum of numbers 1 through NUMBER inclusive."
  (let ((total 0))
    (while (> number 0)
      (setq total (+ total number))
      (setq number (1= number)))      ; Error here.
    total))

Infoでこれを読んでいる場合は、通常通りにこの定義を確認できます。エコー領域に triangle-bugged が表示されるはずです。

次に、引数に4を指定してtriangle-bugged関数を評価します:

(triangle-bugged 4)

これにより、次のような内容の *Backtrace* バッファが作成され、書き込まれます:

---------- Buffer: *Backtrace* ----------
Debugger entered--Lisp error: (void-function 1=)
  (1= number)
  (setq number (1= number))
  (while (> number 0) (setq total (+ total number))
        (setq number (1= number)))
  (let ((total 0)) (while (> number 0) (setq total ...)
    (setq number ...)) total)
  triangle-bugged(4)
  eval((triangle-bugged 4) 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と入力することでデバッガを終了できます。)

実際には、これほど単純なバグであれば、Lispのエラー行を見れば定義を修正するために何を知るべきかが分かります。関数 1= は void です。

ただ、何が起きているのかよく分からない場合はどうでしょうか。バックトレースの全文を確認できます。

Emacsは自動的にデバッガを起動し、*Backtrace*バッファを表示します。また、以下に説明するように、手動でデバッガを起動することも可能です。

*Backtrace* バッファを下から上に向かって読み進めてください。そこには、エラーに至った Emacs の動作が記されています。Emacs が C-x C-e (eval-last-sexp) をインタラクティブに呼び出し、それが triangle-bugged 式の評価につながりました。その上の各行は、Lisp インタプリタが次に何を評価したかを示しています。

バッファの上から3行目は

(setq number (1= number))

Emacsはこの式を評価しようとしました。そのために、上から2行目に示されている内側の式を評価しようとしました:

(1= number)

ここでエラーが発生しました。最上行にある通りです:

Debugger entered--Lisp error: (void-function 1=)

間違いを修正し、関数定義を再評価した上で、再度テストを実行してください。