【问题标题】:In clojure, is there are recursive version of code logging?在 clojure 中,是否有递归版本的代码日志记录?
【发布时间】:2011-06-23 17:13:22
【问题描述】:

我见过以下代码记录宏的一些变体:

 (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))))

【问题讨论】:

  • 你能举个例子说明你在找什么吗?我几乎可以肯定不知道答案,但我不清楚您想要示例代码没有提供什么......

标签: logging clojure


【解决方案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)))

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

【讨论】:

  • 我接受你的回答,但你有什么理由需要为可变长度代码制作 logx 吗?我做了一个不需要这个的版本。
  • 没有硬道理。这似乎是有利的。
【解决方案2】:

我通常使用 clojure.contrib.trace 来战术性地介绍这类东西,这里解释得比我能做的更好:

Debugging in Clojure?

【讨论】:

    【解决方案3】:

    一种稍微不同但更有针对性的方法是调用一个函数,将日志函数添加到您正在处理的名称空间中的每个函数中,以便它们在调用时自行记录它们。这将让您看到您的代码运行,而无需查看 map 的所有内部结构。

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

    【讨论】:

    • 不是为了避免直接回答问题,但这个答案很可能是比问题所要求的更好的解决方案。
    • 虽然该链接很有用,我对此表示感谢,但我仍然可以看到符合我要求的代码的用例。一个很好的例子是,当您编写使用核心函数而不是用户定义的相对较大的代码块时,您只想记录链中的函数返回,而不是对这些函数的所有调用。
    • 是的,再看一遍,我觉得可能有用。我会试着写点东西。
    猜你喜欢
    • 1970-01-01
    • 2018-02-11
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    相关资源
    最近更新 更多