我希望能够编写一个函数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:/...."
是否有内置函数可以执行此操作?
答案 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中定义命名空间,您可以创建没有相应源文件的命名空间。