É possível edebug um lambda retornado por uma função?

7

Por exemplo,

(defun create-function (number)
  `(lambda () (* ,number ,number)))

(defalias 'square-two (create-function 2) "adds two")

(square-two)
Russ Kiselev
fonte

Respostas:

6

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.

npostavs
fonte
2

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.

Desenhou
fonte
2
O título da pergunta mencionado edebug, não debug.
N26:
@npostavs: Espero que alguém poste uma resposta específica para o edebug. Eu não uso o edebug, então não posso ajudar lá. Se o edebug não puder ser usado para esse caso de uso (tentei brevemente, mas não encontrei uma solução útil), uma alternativa é usar o padrão debug. Mas imagino que o edebug também possa ser usado para isso.
Drew
Sim, estou interessado principalmente edebug. Eu tentei usar edebug-on-entrycom pouco sucesso.
27417 Russ Russisisev
1

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))))
Stefan
fonte
Hmm, é interessante, mas não consigo fazê-lo funcionar. Eu entendo (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.
Nvidia #
Hmm ... acho que está quebrado de alguma forma, então. Eu sei que já vi isso funcionando (quando eu o encontrei alguns anos atrás, enquanto tentava consertar algo no Edebug), mas eu nunca realmente o usei.
Stefan