在通用的lisp中,可以使用函數(trace name)來查看關於函數調用的輸出。如何描述本地函數(跟蹤)?
如果我的函數是用局部範圍聲明的,我該如何描述它來跟蹤?
例如,我該如何追蹤欄,如下:
(defun foo (x)
(labels ((bar (y) (format t "bar: ~a~&" y)))
(bar x)))
在通用的lisp中,可以使用函數(trace name)來查看關於函數調用的輸出。如何描述本地函數(跟蹤)?
如果我的函數是用局部範圍聲明的,我該如何描述它來跟蹤?
例如,我該如何追蹤欄,如下:
(defun foo (x)
(labels ((bar (y) (format t "bar: ~a~&" y)))
(bar x)))
跟蹤本地函數與(TRACE ...)
不是由ANSI Common Lisp的定義。
一些實現有擴展來做到這一點。例如參見CMU CL。
除此之外,您需要在FOO的定義中添加一些代碼。例如,有一個宏可以讓你可以將調用寫入bar(trace-it(bar x)),並且宏將擴展爲打印入口和出口的代碼。
我很懷疑。 – 2009-04-08 16:13:49
由於沒有跟蹤本地函數的標準方式,我會去了解這個問題的方法是通過編寫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)))
本地函數沒有跟蹤,沒有文檔,也沒有獨立重新定義父類。你放棄了很多。出於這個原因,他們最好有一個很好的理由來成爲本地人:那麼好的理由是......鼓輪...需要訪問父功能的詞彙環境。上面的`bar`函數沒有;它可以簡單地移到`foo`之外,作爲一個頂層函數。 – Kaz 2014-01-29 00:31:52