我在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))