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

时间:2012-12-19 15:25:03

标签: clojure

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

我认为使用与Emacs存储数据的方式类似的机制;通过生成一些lisp表单并将其保存在文件中。然后可以在clojure开始时评估这些,并且每个人都很开心。使用像leningen这样的工具时,这些文件最终会出现在根目录中。

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

1 个答案:

答案 0 :(得分:14)

如果您正在寻找当前在运行时执行代码的命名空间,那么您只需查看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"}

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