Clojure 如何查找具有给定命名空间的关联文件?
我希望能够编写一个函数Clojure 如何查找具有给定命名空间的关联文件?,clojure,Clojure,我希望能够编写一个函数查找文件,其中我传递了一个名称空间,它将能够自动解析.clj文件 即: 是否有一个内置函数可以做到这一点?否。不仅没有内置函数,而且这在一般情况下甚至不是一件已知的事情,因为给定的名称空间可以在零个或多个文件中定义。例如,clojure.core是在许多源文件中定义的,通过在repl中定义名称空间,您可以创建完全没有相应源文件的名称空间。您可以使用以下技巧获得一些信息: (defn files-for-ns [ns-sym] (->> (ns-publics
查找文件
,其中我传递了一个名称空间,它将能够自动解析.clj
文件
即:
是否有一个内置函数可以做到这一点?否。不仅没有内置函数,而且这在一般情况下甚至不是一件已知的事情,因为给定的名称空间可以在零个或多个文件中定义。例如,clojure.core是在许多源文件中定义的,通过在repl中定义名称空间,您可以创建完全没有相应源文件的名称空间。您可以使用以下技巧获得一些信息:
(defn files-for-ns [ns-sym]
(->> (ns-publics ns-sym)
keys
(map resolve)
(map meta)
(map :file)
set))
或者,如果需要完整路径:
(require '[clojure.java.io :as io])
(defn files-for-ns [ns-sym]
(->> (ns-publics ns-sym)
keys
(map resolve)
(map meta)
(map :file)
set
(keep identity)
(map io/resource)
(map str)))
例如:
(use 'clojure.pprint)
(pprint (files-for-ns 'clojure.core))
("jar:file:/Users/Borkdude/.m2/repository/org/clojure/clojure/1.9.0-alpha10/clojure-1.9.0-alpha10.jar!/clojure/gvec.clj"
"jar:file:/Users/Borkdude/.m2/repository/org/clojure/clojure/1.9.0-alpha10/clojure-1.9.0-alpha10.jar!/clojure/core_proxy.clj"
"jar:file:/Users/Borkdude/.m2/repository/org/clojure/clojure/1.9.0-alpha10/clojure-1.9.0-alpha10.jar!/clojure/core.clj"
"jar:file:/Users/Borkdude/.m2/repository/org/clojure/clojure/1.9.0-alpha10/clojure-1.9.0-alpha10.jar!/clojure/core_print.clj"
"jar:file:/Users/Borkdude/.m2/repository/org/clojure/clojure/1.9.0-alpha10/clojure-1.9.0-alpha10.jar!/clojure/core_deftype.clj"
"jar:file:/Users/Borkdude/.m2/repository/org/clojure/clojure/1.9.0-alpha10/clojure-1.9.0-alpha10.jar!/clojure/genclass.clj")
也许clojure.core是个坏例子。通常,每个命名空间有一个文件。不知怎的,emacs知道当我评估一个文件时该去哪里找,这正是我要找的。。。但是你知道当我们加载一个名称空间,文件拼写错误时。。。有一个例外是说。。。对不起,x/y/z.clj丢失了,所以不是已经加载的文件,而是即将加载的文件。对不起,我不完全清楚你的意思。
(use 'clojure.pprint)
(pprint (files-for-ns 'clojure.core))
("jar:file:/Users/Borkdude/.m2/repository/org/clojure/clojure/1.9.0-alpha10/clojure-1.9.0-alpha10.jar!/clojure/gvec.clj"
"jar:file:/Users/Borkdude/.m2/repository/org/clojure/clojure/1.9.0-alpha10/clojure-1.9.0-alpha10.jar!/clojure/core_proxy.clj"
"jar:file:/Users/Borkdude/.m2/repository/org/clojure/clojure/1.9.0-alpha10/clojure-1.9.0-alpha10.jar!/clojure/core.clj"
"jar:file:/Users/Borkdude/.m2/repository/org/clojure/clojure/1.9.0-alpha10/clojure-1.9.0-alpha10.jar!/clojure/core_print.clj"
"jar:file:/Users/Borkdude/.m2/repository/org/clojure/clojure/1.9.0-alpha10/clojure-1.9.0-alpha10.jar!/clojure/core_deftype.clj"
"jar:file:/Users/Borkdude/.m2/repository/org/clojure/clojure/1.9.0-alpha10/clojure-1.9.0-alpha10.jar!/clojure/genclass.clj")