【问题标题】:Get callers namespace in clojure在clojure中获取调用者命名空间
【发布时间】:2018-07-24 13:54:29
【问题描述】:

我在 Clojure 中封装了一个日志库;我们称之为foo.logger 的命名空间。现在我有了另一个命名空间,例如 bar.baz,并从那里调用记录器。

是否有一些惯用/好方法,我可以确定记录器内调用者命名空间的命名空间?我不想将此设置为记录器的参数;-)

【问题讨论】:

  • 如果您询问 Clojure,为什么要使用 Java 标记?请务必准确标记您的问题。
  • 因为 Clojure 被编译为 ByteCode,如果有人在 Java 中有很好的答案,我可以适应这个!
  • 按照这个逻辑,为什么不也用 Scala 标记它呢?这也被编译成字节码。
  • Clojure 人认为使用 Java 解决方案是惯用的,而不是 Scala、Kotlin、JRuby 等。

标签: logging clojure namespaces


【解决方案1】:

这是使用宏是可靠选择的少数情况之一。

使打印*ns 值的宏将在调用者空间中获得*ns* 的值,因为该宏将在该命名空间中展开并运行。

(defmacro log [msg]
  `(printf "%s:%s\n" ~*ns* ~msg))

请注意围绕此的“宏传染”,因为任何想要扩展此功能的东西也需要是一个宏,尽管我在过去六年一直在这样做,而且它经常不是问题.

【讨论】:

  • 很高兴知道,宏将在调用者命名空间中扩展:-)
【解决方案2】:

不是 100% 正确的解决方案,但适用于大多数情况:

(some->> (.getStackTrace (Thread/currentThread))               
         (map #(re-matches #"^([^$]+)\$.+" (.getClassName %))) 
         (keep last)
         (dedupe)
         (second)
         (symbol)
         (find-ns))

【讨论】:

    猜你喜欢
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多