Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 如何查找具有给定命名空间的关联文件?_Clojure - Fatal编程技术网

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")