我将日志记录库包装在Clojure中;我们将此foo.logger
的命名空间称为。现在,我有了另一个bar.baz
之类的命名空间,从那里我叫记录器。
是否有一些惯用的/好的方法,可以确定记录器内部调用者名称空间的名称空间?我不想将此设置为记录器的参数;-)
答案 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))