获取clojure中的调用者命名空间



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

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

这是使用宏是一个可靠选择的罕见情况之一。

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

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

试着意识到围绕这一点的"宏观传染",因为任何想要扩展这一功能的东西都需要是宏观的,尽管我在过去六年里一直在做这件事,但这并不是一个经常出现的问题。

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

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

最新更新