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.

Foi útil?

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:

http://www.sbcl.org/manual/Deterministic-Profiler.html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top