Как мне описать локальную функцию (трассировать)? - PullRequest
4 голосов
/ 08 апреля 2009

В общем lisp функцию (имя трассировки) можно использовать для просмотра вывода о вызовах функции.

Если моя функция объявлена ​​с локальной областью действия, как я могу описать ее для отслеживания?

например, как мне отследить полосу, ниже:

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

Ответы [ 2 ]

3 голосов
/ 08 апреля 2009

Поскольку не существует стандартного способа трассировки локальных функций, я бы решил проблему путем написания макроса tracing-labels, который реализует трассировку, с преобразованием следующего:

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

примерно так:

(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)))
2 голосов
/ 08 апреля 2009

Трассировка локальных функций с помощью (TRACE ...) не определяется ANSI Common Lisp.

Некоторые реализации имеют расширения для этого. См. Например CMU CL .

Кроме этого, вам нужно добавить некоторый код в определение FOO. Например, может быть полезно иметь макрос, чтобы вы могли записать вызов bar как (trace-it (bar x)), а макрос расширился бы до кода, который печатает вход и выход.

...