如何使用给定的命名空间查找关联文件?

时间:2016-08-30 02:49:12

标签: clojure

我希望能够编写一个函数lookup-file来传递命名空间,它将能够自动解析.clj文件。

即:

(lookup-file 'rabbit.warren-test)
;=> "test/rabbit/warren-test.clj"

(lookup-file 'rabbit.warren)
;=> "src/rabbit/warren.clj"

(lookup-file 'clojure.core)
;=> "~/.m2/repositories/org/clojure/clojure/clojure-1.9.0.jar:/...."

是否有内置函数可以执行此操作?

2 个答案:

答案 0 :(得分:2)

你可以通过使用这个技巧获得一些信息:

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

答案 1 :(得分:1)

没有。不仅没有内置函数,这甚至不是一般可知的事情,因为给定的命名空间可以在零个或多个文件中定义。例如,clojure.core在许多源文件中定义,通过在repl中定义命名空间,您可以创建没有相应源文件的命名空间。