【问题标题】:What's the idiomatic way to log values in a threading macro?在线程宏中记录值的惯用方式是什么?
【发布时间】:2017-11-26 05:18:19
【问题描述】:

在我的代码中,我广泛使用线程宏。有时虽然我想在宏中记录一个或多个值。例如,

(-> val
    (fn-1)
    (fn-2)
    (fn-3))

在这里,假设我想记录fn-2 的结果。我该怎么做呢?

我尝试了两种方法:

  • trace 放在fn-2 之后。
  • fn-2 之后放置一个匿名函数,例如#(do (log/debug %) %)

使用trace 似乎并不理想,因为它无法与真正的记录器集成。滚动你自己的函数似乎也不理想。

这里的最佳做法是什么?

【问题讨论】:

  • 你能解释一下为什么滚动你自己的函数不理想吗?
  • (doto log/debug) 适用于->,但不适用于->>
  • 我在截屏视频中稍微介绍了这一点:curiousprogrammer.net/2017/11/20/… 大多数情况下,它使用匿名函数或(doto println) 用于线程优先宏。如果您需要更复杂的工具,我建议您使用调试器。

标签: logging clojure


【解决方案1】:

您可以创建一个更高阶的debug 函数,用您想要的任何逻辑包装您的函数。下面是一个简单打印的例子:

(defn debug
  ([v d bmf] (debug v d bmf nil))
  ([v f before-msg-fmt amf]
   (let [r (f v)]
     (println (format before-msg-fmt v)
              (str (when amf (format amf r))))
     r)))

所以用以下函数调用它:

(def fn1 identity)
(def fn2 inc)
(def fn3 (fn[x] (* x 3)))

(-> 5
    (debug fn1 "here! %s")
    (debug fn2 "old val: %s" "new val: %s")
    fn3)

生产

here! 5 
old val: 5 new val: 6
=> 18

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 2011-12-25
    • 2013-01-03
    • 1970-01-01
    相关资源
    最近更新 更多