在clojure中,是否有递归版本的代码记录?

时间:2011-02-08 20:43:40

标签: logging clojure

我已经看到以下代码记录宏的一些变体:

 (defmacro log
   "for debugging, output code and code->val to stdout, returns val"
   [code]
    `(let [c# ~code]
      (prn '~code)
      (clojure.pprint/pprint c#)
      c#))

但是,我还没有看到一个递归版本,它包含了代码体中的所有宏或函数形式。有没有人有良好的工作实施?

编辑:

澄清一下,例如以下代码:

 (map #(+ % 10) (range 5))

将它包装在递归日志宏中:

 (r-log (map #(+ % 10) (range 5)))

宏观扩张应该是:

 (log (map #(log (+ % 10)) (log (range 5))))

3 个答案:

答案 0 :(得分:2)

稍微不同,更有针对性的方法是调用一个函数,将函数添加到您正在处理的名称空间中的每个函数,以便在调用它们时自动记录它们。这将让你看到你的代码运行,而不会看到地图的所有内部。

clojure: adding a debug trace to every function in a namespace?

答案 1 :(得分:1)

我通常使用clojure.contrib.trace来战术性地介绍这种事情,这里我解释得比我更好:

Debugging in Clojure?

答案 2 :(得分:1)

好的,我想出了以下内容。我想这就是你要求的:

注意logx是您的log宏,其变量长度为code

 (defmacro logx
   "for debugging, output code and code->val to stdout, returns val"
   [& code]
   `(let [c# ~code]
      (prn '~code)
      (clojure.pprint/pprint c#)
      c#))

 (defn add-logx-calls [code]
   (if (seq? code)
     `(logx ~@(map add-logx-calls code))
     code))

 (defmacro r-log
   [& code]
   (apply add-logx-calls code))

 (r-log (map #(+ % 10) (range 5)))

除了您给我的样品外,我没有测试过它。如果你改进它,请告诉我们。