【问题标题】:In clojure, how do I get the file name of the current namespace?在clojure中,如何获取当前命名空间的文件名?
【发布时间】:2012-12-19 15:25:02
【问题描述】:

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

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

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

【问题讨论】:

  • 您能否更详细地解释一下为什么您不想将“已保存”的数据保留在根目录中?您可以阅读并从 clojure 进行评估。
  • 我保存的数据部分是人类可读的。对我来说,将它与它所引用的文件一起保存更有意义。它将与它一起进行版本控制。

标签: clojure


【解决方案1】:

如果您正在寻找代码当前在运行时执行的命名空间,那么您可以简单地查看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 将指向源文件的路径名。

【讨论】:

  • 嗯。这让我想知道命名空间本身是否有任何元数据,但命名空间实际上并没有绑定符号。我认为尽管您提出了一个很好的观点——无论我做什么,如果我在 REPL 中运行代码都可能会失败。命名空间不会直接映射到文件,即使它看起来是这样。
  • 您可以使用 (the-ns 'clojure.core) 从符号获取命名空间,并且可以在 ns 上获取/设置元数据...但编译器似乎没有将源文件作为元数据添加到ns。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-13
  • 1970-01-01
  • 2011-03-25
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多