Pregunta

Con lisp común y estoy asumiendo las propiedades de introspección. ¿Cómo puedo agregar código al código común común que me dirá cuándo se llama a una función y cuándo ha terminado de ejecutarse? Quiero tomar cualquier código lisp y esta modificación particular al código. Calculo con el análisis AST de lisp, esto debería ser posible.

¿Fue útil?

Solución

Puede usar (función de rastreo) para un mecanismo simple. Para algo más complicado, aquí hay una buena discusión 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]> 

Otros consejos

Si CLOS es una opción, tiene métodos antes, después y alrededor que se ejecutan antes, después y alrededor de otros métodos.

Common lisp tiene una función TRACE que informa la función, los argumentos y el valor resultante de cada llamada especificada. Aquí está la página de documentos para la versión de Steel Bank, pero debería encontrar algo similar en la mayoría de las implementaciones:

http://www.sbcl.org/manual/Function-Tracing.html

El sistema también incluye un generador de perfiles:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top