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 lambdaformulá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 defaliasformulário, poderá passar pela lambdaavaliaçã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 dpara percorrer a função. Use cpara pular uma etapa (pular subetapas). E, como sempre, C-h minforma 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-entrycom 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.