Por ejemplo,
(defun create-function (number)
`(lambda () (* ,number ,number)))
(defalias 'square-two (create-function 2) "adds two")
(square-two)
Edebug no admite código de instrumentación construido en tiempo de ejecución. Si intenta instrumentar create-function
, el paso se producirá cuando evalúe (create-function 2)
, no cuando ejecute square-two
.
Sin lambda
embargo, Edebug admite formas de instrumentación , por lo que puede reescribir su ejemplo utilizando el enlace léxico:
;;; -*- lexical-binding: t -*-
(defun get-lexical-function (number)
(lambda () (* number number)))
(defalias 'square-two (get-lexical-function 2) "adds two")
Luego, si instrumenta get-lexical-function
antes de evaluar el defalias
formulario, puede recorrerlo lambda
cuando evalúe square-two
.
Si.
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)
Use d
para recorrer la función. Use c
para saltear un paso (salte los subpasos). Y, como siempre, C-h m
le brinda más información sobre el depurador, incluidas otras claves.
edebug
, nodebug
.debug
. Pero me imagino que edebug también se puede usar para esto.edebug
. He intentado usaredebug-on-entry
con poco éxito.Por cierto, aunque la solución de npostavs es la mejor opción para su ejemplo, en aquellos casos en los que realmente necesita construir el código manualmente con comillas inversas (por ejemplo, dentro
defmacro
), puede intentar:fuente
(invalid-function square-two)
. El cambio a(defmacro create-function (number) (edebug-` (* ,number ,number)))
produce código de trabajo, pero aún no puedo lograr pasarlo.