2010-08-04 49 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