Frage

Mit Common Lisp und ich gehe davon aus, die Selbstbeobachtung Eigenschaften. Wie kann ich Code zu Common Lisp-Code hinzufügen, die mir sagen, wenn eine Funktion aufgerufen wird und wenn beendet ausgeführt wird. Ich möchte jede Lisp-Code nehmen und diese besondere Modifikation des Codes. Ich stelle dar, mit AST-Analyse des Lisp, sollte dies möglich sein.

War es hilfreich?

Lösung

Sie können mit (trace function) für einen einfachen Mechanismus. Für etwas mehr beteiligt, hier ist eine gute Diskussion von 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]> 

Andere Tipps

Wenn CLOS ist eine Option, es hat vor, nach und um Methoden diesen Lauf vor, nach und um andere Methoden.

Common Lisp hat eine TRACE-Funktion, die die Funktion, Argumente und sich ergebende Wert jedes Anrufs angegeben Berichte. Hier ist die doc-Seite für Stahl Bank Version, aber Sie sollten etwas ähnliches in den meisten Implementierungen finden:

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

Das System enthält auch einen Profiler:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top