Question

Avec le lisp commun et j’assume les propriétés d’introspection. Comment puis-je ajouter du code au code commun lisp qui me dira quand une fonction est appelée et quand a fini de s'exécuter. Je veux prendre n'importe quel code Lisp et cette modification particulière au code. Je pense qu'avec l'analyse AST de lisp, cela devrait être possible.

Était-ce utile?

La solution

Vous pouvez utiliser la (fonction de suivi) pour un mécanisme simple. Pour quelque chose de plus impliqué, voici une bonne discussion 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]> 

Autres conseils

Si la CLOS est une option, elle comporte avant, après et autour des méthodes exécutées avant, après et autour d'autres méthodes.

Common lisp a une fonction TRACE qui indique la fonction, les arguments et la valeur résultante de chaque appel spécifié. Voici la page de documentation de la version de Steel Bank, mais vous devriez trouver quelque chose de similaire dans la plupart des implémentations:

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

Le système comprend également un profileur:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top