gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:32:20 25 4
gpt4 key购买 nike

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

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

我可以根据标准目录约定进行构建,但我更愿意直接从 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"}

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

关于clojure - 在clojure中,如何获取当前命名空间的文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13955580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com