2012-12-19 123 views
6

我在写一些需要存储关于当前命名空间的数据的代码。我的代码正在生成本体,我需要分配需要在clojure调用之间保持的URI。这些URI是自动生成的,所以它不仅仅是编写代码的作者。在clojure中,我如何获取当前名称空间的文件名?

我认为使用类似Emacs存储数据的机制;通过生成一些lisp表单并将它们保存在文件中。当clojure开始并且每个人都开心时,这些可以被评估。当使用像leningen这样的工具时,这些文件将在根目录中结束。

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

+0

你能否更详细地解释为什么你不想将“保存”的数据保存在根目录中?你可以阅读它并从clojure评估。 –

+0

我保存的数据将部分用于人类可读。对我来说,保留它所指向的文件更有意义。它将与它一起版本化。 –

回答

12

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

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

如果你正在寻找的文件,在其中一个VAR或命名空间的定义,那么你指的是由编译器作为对VAR的元数据存储时,它计算一个def形式的源代码位置:

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将指向源文件的路径名。

+0

嗯。这让我想知道名称空间本身是否有任何元数据,但名称空间并不实际绑定符号。我认为,尽管你已经说得很好 - 我做了什么,如果我在REPL中运行代码,很可能会失败。名称空间不会直接映射到文件,即使它看起来像。 –

+0

你可以使用'(the-ns'clojure.core)'从一个符号到一个名字空间,你可以在ns上获得/设置元数据......但是编译器似乎并没有将源文件添加为元数据到ns。 – Alex

相关问题