8

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

我想使用与 Emacs 存储数据的方式类似的机制;通过生成一些 lisp 表单并将它们保存在文件中。然后可以在 clojure 启动并且每个人都很高兴时评估这些。使用 leningen 等工具时的问题是,这些文件最终会出现在根目录中。

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

4

1 回答 1

18

如果您正在寻找代码当前在运行时执行的命名空间,那么您可以简单地查看 的值clojure.core/*ns*

user> (defn which-ns? [] (str *ns*))
user> (which-ns?)
"user"
user> (ns user2)
user2> (which-ns?)
"user2"

def如果您正在查找定义了 var 或命名空间的文件,那么编译器在评估表单时会将您引用的源代码位置作为元数据存储在 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则将指向源文件的路径名。

于 2012-12-19T16:48:06.397 回答