Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logging 在clojure中获取调用方命名空间_Logging_Clojure_Namespaces - Fatal编程技术网

Logging 在clojure中获取调用方命名空间

Logging 在clojure中获取调用方命名空间,logging,clojure,namespaces,Logging,Clojure,Namespaces,我用Clojure包装了一个日志库;让我们调用这个foo.logger的名称空间。现在我有了另一个名称空间,比如bar.baz,从那里我调用了记录器 是否有一些惯用/好的方法可以确定记录器中调用方名称空间的名称空间?我不想将此设置为记录器的参数;-) 不是100%正确的解决方案,但适用于大多数情况: (some->> (.getStackTrace (Thread/currentThread)) (map #(re-matches #"

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


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

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

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

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

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

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

请注意这方面的“宏传染”,因为任何想要扩展此功能的东西都需要是宏,尽管我在过去六年中一直在这样做,但这并不是一个经常出现的问题。

如果您询问Clojure,为什么要使用Java标记?请务必准确地标记您的问题。因为Clojure是编译成字节码的,如果有人用Java有一个好的答案,我可以修改它!按照这个逻辑,为什么不也用Scala标记它呢?这也被编译成字节码。Culjule认为使用java解决方案是习惯的,但不是Scala、Kotlin、JRube等。