Macro TRACE
, UNTRACE
trace
function-name* => trace-result
untrace
function-name* => untrace-result
function-name - 関数名
trace-result - function-nameが与えられたときは実装依存。 与えられなかったときは関数名のリスト。
untrace-result - 実装依存
trace
とuntrace
は、トレース機能の呼び出しを制御します。
trace
をひとつ以上のfunction-nameとともに呼び出したとき、 その関数は「トレースされた」ものになります。 トレースされた関数が呼び出されたときはいつでも、 呼び出しについての情報、渡された引数、最終的な返却値について、 トレース出力に印刷されます。 もしtrace
がfunction-nameを指定せず使われたとき、 トレースの動作は行いませんが、 代わりに現在トレースされている関数のリストが返却されます。
untrace
をひとつ以上のfunction-nameとともに呼び出したとき、 その関数は「トレースが解除された」ものになります (つまりもはやトレースされたものではありません)。 もしuntrace
がfunction-nameを指定せず使われたとき、 現在トレースされている全ての関数のトレースが解除されます。
defun fact (n) (if (zerop n) 1 (* n (fact (- n 1)))))
(=> FACT
trace fact)
(=> (FACT)
;; もちろんトレースの出力フォーマットは実装依存です。
3)
(fact 1 Enter FACT 3
>> 2 Enter FACT 2
>> | 3 Enter FACT 1
>> | 4 Enter FACT 0
>> | | 4 Exit FACT 1
>> | | 3 Exit FACT 1
>> | 2 Exit FACT 2
>> | 1 Exit FACT 6
>> => 6
function-namesによる名前の関数定義が変更されるかもしれません。
指定された関数名で定義されたものか、 すでにトレースされているものかのどちらか
トレース指定が、すでにトレースされている関数であるときか、 あるいはトレースを解除した関数がトレースされていない関数のとき、 有害になる効果を生成するべきではありませんが、 しかし警告が発せられるかもしれません。
trace
とuntrace
は、 追加で実装依存の引数の形式を受け取るかもしれません。 そのトレース出力の形式は実装依存です。
trace
は非標準のオプションを受け取れるように拡張することができますが、 実装はこの標準によって指定されたものでも 実装が拡張によって追加されたものでもない 構文かオプションが使われたときに 警告を発するように勧められます(ただし要求ではありません)。 なぜなら、それは誤字によるものであったり、 または今の実装ではない他の実装の中でサポートされている機能に 依存したものの可能性があるからです。