Получить доступные clojure пространства имен - PullRequest
6 голосов
/ 04 августа 2010

Существует ли идиоматический способ получения доступных пространств имен, которые можно использовать?

(all-ns) возвращает только уже использованные пространства имен.(Package/getPackages) возвращает все пакеты Java, доступные для import, но только те пространства имен Clojure, которые уже используются.

Затем я наткнулся на этот пост , но он использует магию пути к классам.

Итак, я хочу получить что-то вроде ('clojure.core 'clojure.set ... 'clojure.contrib.accumulators 'clojure.contrib.condition ...), если у меня есть clojure.jar и contrib.jar на моем пути к классам, но я еще ничего не использовал.

Ответы [ 2 ]

9 голосов
/ 04 августа 2010

Вам нужно будет сделать «магию пути к классам». Поскольку нет никакого реестра, вы должны пройти путь к классам и просмотреть каждый исходный файл clojure, чтобы определить, какие пространства имен доступны. (Если файлы не скомпилированы AOT. В противном случае вам понадобится другая эвристика.)

Я думаю, что функция, используемая в связанном посте, - лучший путь: clojure.contrib.find-namespaces/find-namespaces-on-classpath.


Устаревший с Clojure 1.3.0; используйте сейчас clojure.tools.namespace.find / find-namespaces и clojure.java.classpath / classpath из http://github.com/clojure/java.classpath

2 голосов
/ 11 декабря 2012

Я считаю 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)
...