Por exemplo,
(defun create-function (number)
`(lambda () (* ,number ,number)))
(defalias 'square-two (create-function 2) "adds two")
(square-two)
O Edebug não suporta código de instrumentação construído em tempo de execução. Se você tentar instrumentar create-function
, o passo ocorrerá quando você avaliar (create-function 2)
, não quando executar square-two
.
O Edebug suporta lambda
formulários instrumentados , portanto, você pode reescrever seu exemplo usando a ligação lexical:
;;; -*- lexical-binding: t -*-
(defun get-lexical-function (number)
(lambda () (* number number)))
(defalias 'square-two (get-lexical-function 2) "adds two")
Então, se você instrumentar get-lexical-function
antes de avaliar o defalias
formulário, poderá passar pela lambda
avaliação square-two
.
Sim.
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 percorrer a função. Use c
para pular uma etapa (pular subetapas). E, como sempre, C-h m
informa mais sobre o depurador, incluindo outras chaves.
edebug
, nãodebug
.debug
. Mas imagino que o edebug também possa ser usado para isso.edebug
. Eu tentei usaredebug-on-entry
com pouco sucesso.BTW, enquanto a solução da npostavs é a melhor opção para o seu exemplo, nos casos em que você realmente precisa criar o código manualmente com aspas (por exemplo, dentro
defmacro
), você pode tentar:fonte
(invalid-function square-two)
. Mudar para(defmacro create-function (number) (edebug-` (* ,number ,number)))
produz código funcional, mas ainda não consigo passar por ele.