2009-04-08 12 views
4

En langage Lisp commun, la fonction (nom de la trace) peut être utilisée pour voir la sortie des appels à une fonction.Comment décrire une fonction locale à (trace)?

Si ma fonction est déclarée avec une portée locale, comment puis-je la décrire à tracer?

par exemple, comment puis-je trace la barre, ci-dessous:

(defun foo (x) 
    (labels ((bar (y) (format t "bar: ~a~&" y))) 
    (bar x))) 
+2

Les fonctions locales n'ont pas de trace, pas de docstrings, pas de redéfinition indépendante de leur parent. Tu abandonnes beaucoup. Pour cette raison, il vaut mieux avoir une bonne raison d'être local: et cette bonne raison est ... le roulement de tambour ... nécessitant l'accès à l'environnement lexical de la fonction parente. Votre fonction 'bar' ci-dessus ne fonctionne pas; il peut être trivialement déplacé en dehors de 'foo' pour rester seul en tant que fonction de premier niveau. – Kaz

Répondre

2

Tracing fonctions locales (TRACE ...) n'est pas défini par ANSI Common Lisp.

Certaines implémentations ont des extensions pour le faire. Voir par exemple CMU CL.

À part cela, vous auriez besoin d'ajouter du code à la définition de FOO. Par exemple, il peut être utile d'avoir une macro afin que vous puissiez écrire l'appel à la barre comme (trace-it (barre x)) et la macro se développerait en code qui imprime l'entrée et la sortie.

+0

Je m'en doutais autant. –

3

Comme il n'y a aucun moyen standard de traçage des fonctions locales, la façon dont je vais le problème est en écrivant une macro tracing-labels qui implémente le traçage, la transformation de ce qui suit:

(defun foo (x) 
    (tracing-labels ((bar (y) (format t "bar: ~a~&" y))) 
    (bar x))) 

en quelque chose comme ceci:

(defun foo (x) 
    (labels ((bar (y) 
      (format *trace-output* "~&ENTER: ~S" 'bar) ;' 
      (multiple-value-prog1 
       (progn (format t "bar: ~a~&" y)) 
       (format *trace-output* "~&LEAVE: ~S" 'bar)))) ;' 
    (bar x)))