Introspezione Lisp? quando viene chiamata una funzione e quando esce
-
04-07-2019 - |
Domanda
Con lisp comune e sto assumendo le proprietà di introspezione. Come posso aggiungere codice al comune codice lisp che mi dirà quando viene chiamata una funzione e quando ha terminato l'esecuzione. Voglio prendere qualsiasi codice lisp e questa particolare modifica al codice. Immagino con l'analisi AST di lisp, questo dovrebbe essere possibile.
Soluzione
Puoi utilizzare (funzione trace)
per un meccanismo semplice. Per qualcosa di più coinvolto, ecco una buona discussione da 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]>
Altri suggerimenti
Se CLOS è un'opzione, ha metodi prima, dopo e intorno eseguiti prima, dopo e intorno ad altri metodi.
Common lisp ha una funzione TRACE che riporta la funzione, gli argomenti e il valore risultante di ogni chiamata specificata. Ecco la pagina del documento per la versione di Steel Bank, ma dovresti trovare qualcosa di simile nella maggior parte delle implementazioni:
http://www.sbcl.org/manual/Function-Tracing.html
Il sistema include anche un profiler: