我已经看到以下代码记录宏的一些变体:
(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))))
答案 0 :(得分:2)
稍微不同,更有针对性的方法是调用一个函数,将函数添加到您正在处理的名称空间中的每个函数,以便在调用它们时自动记录它们。这将让你看到你的代码运行,而不会看到地图的所有内部。
clojure: adding a debug trace to every function in a namespace?
答案 1 :(得分:1)
我通常使用clojure.contrib.trace来战术性地介绍这种事情,这里我解释得比我更好:
答案 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)))
除了您给我的样品外,我没有测试过它。如果你改进它,请告诉我们。