在clojure中获取呼叫者名称空间

时间:2018-07-24 13:54:30

标签: logging clojure namespaces

我将日志记录库包装在Clojure中;我们将此foo.logger的命名空间称为。现在,我有了另一个bar.baz之类的命名空间,从那里我叫记录器。

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

2 个答案:

答案 0 :(得分:7)

这是在少数情况下使用宏是必不可少的选择之一。

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

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

请尝试了解与此相关的“宏观传染”,因为任何想要扩展此功能的东西都必须也是一个宏,尽管过去六年来我一直在这样做,但通常不会出现问题

答案 1 :(得分:0)

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

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