2009-04-08 6 views
4

共通のlispでは、関数(トレース名)を使用して関数の呼び出しに関する出力を見ることができます。(トレースする)ローカル関数をどのように記述しますか?

私の関数がローカルスコープで宣言されている場合、それをどのようにトレースするのですか?

例えば、どのように私は下に、バーをトレースします:(TRACE ...)でローカル関数をトレース

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

ローカル関数にはトレースがなく、ドキュメントストリングもなく、親の独立した再定義もありません。あなたはたくさんのことをあきらめます。その理由から、彼らは地元の良い理由がある方が良い:そしてその正当な理由は...ドラムロール...親の関数のレキシカル環境へのアクセスが必要なことです。上の 'bar'関数はそうではありません。トップレベルの機能として単独で機能するように、 'foo'の外に自在に移動することができます。 – Kaz

答えて

2

はANSI Common Lispので定義されていません。

一部の実装では、これを行う拡張機能があります。たとえば、CMU CLを参照してください。

それ以外の場合は、FOOの定義にいくつかのコードを追加する必要があります。例えば、barを(trace-it(bar x))として書くことができ、マクロがエントリと終了を出力するコードに展開されるように、マクロを持つと便利です。

+0

私はそれほど疑わしい。 –

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))) 
関連する問題