trace - 便利なdotraceマクロ

ここしばらくHaskellAndroidプログラミングに興味を引かれ、Clojureからは遠ざかっていた。blogの更新は5ヶ月ぶりか。月日が経つのは早いなぁ。

print関数を使ってデバッグしていたが、面倒くさくなってきたので、調べてみたら、ClojureでもCommon Lispみたいなtraceマクロがあった。初めから調べておけば良かったよ。

トレース出力を試すためのサンプルコード。特に意味は無いコード。

(defn mul [a b]
  (* a b))

(defn mul-n [n]
  (loop [n n
	 sum 0]
    (if (<= n 0)
      sum
      (recur (dec n) (+ sum (mul n n))))))
user> (mul-n 3)
14

mul関数をトレースしてみる。
トレースするにはdotraceマクロを使用する。dotraceの第一引数にはトレースしたい関数名をリストで渡す(複数指定できる)。第二引数以降は評価したい式を渡す。

user> (use 'clojure.contrib.trace) ←◆useして
nil
user> (dotrace [mul] (mul-n 3)) ←◆トレースする
TRACE t2746: (mul 3 3)
TRACE t2746: => 9
TRACE t2747: (mul 2 2)
TRACE t2747: => 4
TRACE t2748: (mul 1 1)
TRACE t2748: => 1
14

これは便利。\(^▽^)/

ここ http://groups.google.com/group/clojure/browse_thread/thread/5553d6ab004ad8a0/3cfe2a8709b43a99 を見ると、他のtraceライブラリの情報あるが、一年以上前の投稿なので、今はもっと良いものがあるかもしれない。