回答:
Edebugは、実行時に構築されるインストルメンテーションコードをサポートしていません。インストルメントしようとするとcreate-function
、(create-function 2)
実行時ではなく評価時にステッピングが発生しますsquare-two
。
Edebugはlambda
フォームのインストゥルメンテーションをサポートしていますが、字句バインディングを使用して例を書き換えることができます。
;;; -*- lexical-binding: t -*-
(defun get-lexical-function (number)
(lambda () (* number number)))
(defalias 'square-two (get-lexical-function 2) "adds two")
次に、フォームを評価するget-lexical-function
前にインストルメントする場合defalias
、lambda
を評価するときにステップスルーできますsquare-two
。
はい。
M-x debug-on-entry RET square-two RET
M-: (square-two) RET
Debugger entered--entering a function:
* square-two()
eval((square-two) nil)
eval-expression((square-two) nil nil 127)
funcall-interactively(eval-expression (square-two) nil nil 127)
call-interactively(eval-expression nil nil)
command-execute(eval-expression)
d
関数をステップ実行するために使用します。c
ステップをスキップするために使用します(サブステップをスキップします)。そしていつものようにC-h m
、デバッガーについて、他のキーを含めて詳しく説明します。
debug
です。しかし、edebugもこれに使用できると思います。
edebug
ます。私はedebug-on-entry
ほとんど成功しないように使ってみました。
ところで、npostavsのソリューションがあなたの例にとってより良いオプションですが、バッククォートを使って手動でコードをビルドする必要がある場合(例:内部defmacro
)、あなたは試すことができます:
(defun create-function (number)
(edebug-\` (lambda () (* ,number ,number))))
(invalid-function square-two)
。変更し(defmacro create-function (number) (edebug-` (* ,number ,number)))
て機能するコードを生成しますが、それを実行することはできません。
edebug
ではなくdebug
。