Common Lispのtrace

traceなんていう便利コマンドがあるのですね。

(defun my-gcd (m n)
  (if (= (mod m n) 0) n
    (my-gcd n (mod m n))))

があったときに、Common Lispのプロンプトから以下のようにして使えます。

* (trace my-gcd)

(MY-GCD)
* (my-gcd 18 30)
  0: (MY-GCD 18 30)
    1: (MY-GCD 30 18)
      2: (MY-GCD 18 12)
        3: (MY-GCD 12 6)
        3: MY-GCD returned 6
      2: MY-GCD returned 6
    1: MY-GCD returned 6
  0: MY-GCD returned 6
6

あらステキ。再帰の深さも一目瞭然。

* (untrace my-gcd)

でトレース終了です。