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 lambdaembargo, 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 defaliasformulario, puede recorrerlo lambdacuando 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 dpara recorrer la función. Use cpara saltear un paso (salte los subpasos). Y, como siempre, C-h mle 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-entrycon 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.