Por exemplo,
(defun create-function (number)
`(lambda () (* ,number ,number)))
(defalias 'square-two (create-function 2) "adds two")
(square-two)
Por exemplo,
(defun create-function (number)
`(lambda () (* ,number ,number)))
(defalias 'square-two (create-function 2) "adds two")
(square-two)
Respostas:
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.
debug
. Mas imagino que o edebug também possa ser usado para isso.
edebug
. Eu tentei usar edebug-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:
(defun create-function (number)
(edebug-\` (lambda () (* ,number ,number))))
(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.
edebug
, nãodebug
.