introspecção Lisp? quando uma função é chamada e quando ele sai
-
04-07-2019 - |
Pergunta
Com Common Lisp e eu estou supondo que as propriedades de introspecção. Como posso adicionar código ao código Common Lisp que vai me dizer quando uma função é chamada e, quando terminar a execução. Eu quero tomar qualquer código Lisp e esta modificação especial para o código. Figura I com análise AST de lisp, isso deve ser possível.
Solução
Você pode usar (trace function)
para um mecanismo simples. Para algo mais envolvido, aqui está uma boa discussão de comp.lang.lisp .
[CL_USER]>
(defun fac (n)
"Naïve factorial implementation"
(if (< 1 n)
(* n (fac (- n 1)))
1))
FAC
[CL_USER]> (trace fac)
;; Tracing function FAC.
(FAC)
[CL_USER]> (fac 5)
1. Trace: (FAC '5)
2. Trace: (FAC '4)
3. Trace: (FAC '3)
4. Trace: (FAC '2)
5. Trace: (FAC '1)
5. Trace: FAC ==> 1
4. Trace: FAC ==> 2
3. Trace: FAC ==> 6
2. Trace: FAC ==> 24
1. Trace: FAC ==> 120
120
[CL_USER]>
Outras dicas
Se CLOS é uma opção, tem antes, depois, e em torno métodos que são executados antes, depois e em torno de outros métodos.
Common Lisp tem uma função TRACE que relata a função, argumentos e valor resultante de cada chamada especificado. Aqui está a página doc para a versão de aço Bank, mas você deve encontrar algo semelhante na maioria das implementações:
http://www.sbcl.org/manual/Function-Tracing.html
O sistema também inclui um profiler: