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.

È stato utile?

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:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top