获取可用的clojure命名空间

时间:2010-08-04 13:48:05

标签: clojure namespaces

是否有一种惯用的方法来获取可用的命名空间?

(all-ns)仅返回已使用的命名空间。 (Package/getPackages)返回import可用的所有Java包,但仅返回已使用的Clojure命名空间。

然后我偶然发现this post,但它使用了一些类路径魔法。

所以如果我在类路径上有clojure.jar和contrib.jar,我希望得到类似('clojure.core 'clojure.set ... 'clojure.contrib.accumulators 'clojure.contrib.condition ...)的内容,但我还没有使用过任何东西。

2 个答案:

答案 0 :(得分:9)

你需要做“classpath magic”。由于没有任何类型的注册表,您必须遍历类路径并查看每个clojure源文件以确定可用的命名空间。 (如果文件不是AOT编译的。否则你需要一个不同的启发式。)

我认为链接帖子中使用的功能是最好的方法:clojure.contrib.find-namespaces/find-namespaces-on-classpath


自Clojure 1.3.0以来已弃用;现在使用来自http://github.com/clojure/java.classpath的clojure.tools.namespace.find / find-namespaces和clojure.java.classpath / classpath

答案 1 :(得分:2)

我发现bultitude是一个很好的工具。

示例:

user=> (require '[bultitude.core :as b])
nil

user=> (take 10 (b/namespaces-on-classpath))
(bultitude.core-test bultitude.core clojure.data clojure.string clojure.test clojure.xml clojure.inspector clojure.repl clojure.set clojure.test.junit)

user=> (b/namespaces-on-classpath :prefix "bultitude")
(bultitude.core-test bultitude.core)