2010-08-04 15 views
6

¿Existe alguna forma idiomática de obtener espacios de nombres disponibles que se puedan usar?Obtenga espacios de nombres de clojure disponibles

(all-ns) devuelve solo espacios de nombres ya utilizados. (Package/getPackages) devuelve todos los paquetes Java disponibles para import, pero solo aquellos espacios de nombre Clojure que ya se utilizan.

Luego me encontré con this post, pero utiliza algunos classpath magic.

Así que quiero obtener algo como ('clojure.core 'clojure.set ... 'clojure.contrib.accumulators 'clojure.contrib.condition ...) si tengo el clojure.jar y contrib.jar en mi classpath, pero no he usado nada todavía.

Respuesta

9

Tendrás que hacer "classpath magic". Como no hay ningún tipo de registro, debe recorrer el classpath y buscar en cada archivo fuente de clojure para determinar qué espacios de nombres están disponibles. (En caso de que los archivos no estén compilados AOT. De lo contrario, necesitará una heurística diferente.)

Creo que la función utilizada en la publicación vinculada es la mejor manera de hacerlo: clojure.contrib.find-namespaces/find-namespaces-on-classpath.


Obsoleto desde Clojure 1.3.0; use ahora clojure.tools.namespace.find/find-namespaces y clojure.java.classpath/classpath de http://github.com/clojure/java.classpath

2

He encontrado que bultitude es una gran herramienta para hacer esto.

Ejemplo:

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

ve el complemento perfecto a mi pregunta –

Cuestiones relacionadas