Zum Beispiel,
(defun create-function (number)
`(lambda () (* ,number ,number)))
(defalias 'square-two (create-function 2) "adds two")
(square-two)
Edebug unterstützt keinen zur Laufzeit erstellten Instrumentierungscode. Wenn Sie versuchen zu instrumentieren create-function
, tritt das Stepping bei der Auswertung auf (create-function 2)
, nicht bei der Ausführung square-two
.
Edebug unterstützt jedoch Instrumentierungsformulare lambda
, sodass Sie Ihr Beispiel mithilfe der lexikalischen Bindung neu schreiben können:
;;; -*- lexical-binding: t -*-
(defun get-lexical-function (number)
(lambda () (* number number)))
(defalias 'square-two (get-lexical-function 2) "adds two")
Wenn Sie dann get-lexical-function
vor der Auswertung des defalias
Formulars instrumentieren , können Sie bei der Auswertung die Schritte schrittweise lambda
ausführen square-two
.
Ja.
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)
Verwenden Sie d
diese Option, um die Funktion zu durchlaufen. Verwenden Sie c
diese Option, um einen Schritt zu überspringen (Unterschritte überspringen). Und wie immer C-h m
erfahren Sie mehr über den Debugger, einschließlich anderer Schlüssel.
edebug
Fragentitel nichtdebug
.debug
. Aber ich stelle mir vor, dass edebug auch dafür verwendet werden kann.edebug
. Ich habe versucht,edebug-on-entry
zu wenig Erfolg zu haben.Übrigens, während die Lösung von npostavs die bessere Option für Ihr Beispiel ist, können Sie in den Fällen, in denen Sie den Code wirklich manuell mit Backquotes (z. B. im Inneren
defmacro
) erstellen müssen, Folgendes versuchen:quelle
(invalid-function square-two)
. Das Ändern auf(defmacro create-function (number) (edebug-` (* ,number ,number)))
erzeugt Arbeitscode, aber ich kann es immer noch nicht schaffen, ihn durchzugehen.