2009-04-08 131 views
4

在通用的lisp中,可以使用函數(trace name)來查看關於函數調用的輸出。如何描述本地函數(跟蹤)?

如果我的函數是用局部範圍聲明的,我該如何描述它來跟蹤?

例如,我該如何追蹤欄,如下:

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

本地函數沒有跟蹤,沒有文檔,也沒有獨立重新定義父類。你放棄了很多。出於這個原因,他們最好有一個很好的理由來成爲本地人:那麼好的理由是......鼓輪...需要訪問父功能的詞彙環境。上面的`bar`函數沒有;它可以簡單地移到`foo`之外,作爲一個頂層函數。 – Kaz 2014-01-29 00:31:52

回答

2

跟蹤本地函數與(TRACE ...)不是由ANSI Common Lisp的定義。

一些實現有擴展來做到這一點。例如參見CMU CL

除此之外,您需要在FOO的定義中添加一些代碼。例如,有一個宏可以讓你可以將調用寫入bar(trace-it(bar x)),並且宏將擴展爲打印入口和出口的代碼。

+0

我很懷疑。 – 2009-04-08 16:13:49

3

由於沒有跟蹤本地函數的標準方式,我會去了解這個問題的方法是通過編寫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)))