Lisp Innerlichkeit? wenn eine Funktion aufgerufen wird und wenn es beendet
-
04-07-2019 - |
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.
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: