2010-08-04 114 views
6

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

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

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

所以我想得到像('clojure.core 'clojure.set ... 'clojure.contrib.accumulators 'clojure.contrib.condition ...)这样的东西,如果我的classpath上有clojure.jar和contrib.jar,但我还没有使用任何东西。

回答

9

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

我认为链接文章中使用的函数是最好的方法:clojure.contrib.find-namespaces/find-namespaces-on-classpath


自Clojure 1.3.0以后不推荐使用;现在使用clojure.tools.namespace.find/find-namespaces和clojure.java.classpath/classpath from http://github.com/clojure/java.classpath

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) 
+0

看起来完美的比赛,我的问题 – 2012-12-11 11:35:44