在clojure中,如何获取当前命名空间的文件名?

在clojure中,如何获取当前命名空间的文件名?,clojure,Clojure,我正在编写一些需要存储关于当前名称空间的数据的代码。我的代码正在生成一个本体,我需要分配需要在clojure调用之间保持的URI。这些URI是自动生成的,所以这不仅仅是代码作者编写它们的情况 我想使用与Emacs存储数据类似的机制;通过生成一些lisp表单并将其保存在文件中。然后,当clojure开始时,每个人都很高兴,就可以对这些进行评估。当使用像列宁根这样的工具时,问题在于这些文件最终将位于根目录中 我可以根据标准目录约定进行构建,但我更喜欢直接从clojure获取数据;我知道编译器将源位置

我正在编写一些需要存储关于当前名称空间的数据的代码。我的代码正在生成一个本体,我需要分配需要在clojure调用之间保持的URI。这些URI是自动生成的,所以这不仅仅是代码作者编写它们的情况

我想使用与Emacs存储数据类似的机制;通过生成一些lisp表单并将其保存在文件中。然后,当clojure开始时,每个人都很高兴,就可以对这些进行评估。当使用像列宁根这样的工具时,问题在于这些文件最终将位于根目录中


我可以根据标准目录约定进行构建,但我更喜欢直接从clojure获取数据;我知道编译器将源位置数据添加到clojure;有没有办法让我自己访问这个

如果要查找运行时代码当前正在其中执行的名称空间,则只需查看
clojure.core/*ns*
的值:

user> (defn which-ns? [] (str *ns*))
user> (which-ns?)
"user"
user> (ns user2)
user2> (which-ns?)
"user2"
如果您正在查找定义了var或名称空间的文件,那么编译器在计算
def
表单时会将您引用的源代码位置存储为var上的元数据:

user> (defn foo [x] (inc x))
user> (meta #'foo)
{:arglists ([x]), :ns #<Namespace user>, :name foo, :line 1, :file "NO_SOURCE_FILE"}
user>(defn foo[x](inc x))
用户>(meta#'foo)
{:arglists([x]),:ns#,:name foo,:第1行,:file“NO_SOURCE_file”}

“无源文件”是因为您正在评估REPL中输入的表单。如果您计算源文件中的代码,则
:file
将指向源文件的路径名。

您能否更详细地解释为什么不希望在根目录中保留“已保存”的数据?您可以从clojure中读取和评估。我保存的数据部分是人类可读的。对我来说,把它和它引用的文件放在一起更有意义。它将随它一起进行版本控制。Hmmm。这让我想知道名称空间本身是否有元数据,但名称空间实际上并没有绑定符号。我认为,尽管您提出了一个很好的观点——无论我做什么,如果我在REPL中运行代码,很可能会失败。名称空间不会直接映射到文件,即使它看起来是。您可以使用
(ns'clojure.core)
从符号获取名称空间,并且可以获取/设置ns上的元数据。。。但是编译器似乎没有将源文件作为元数据添加到ns中。