2010-08-04 6 views
6

Gibt es eine idiomatische Weise zur Verfügung Namensraum zu erhalten, die verwendet werden kann?Erhalten verfügbar clojure Namespaces

(all-ns) gibt nur bereits Namespace verwendet. (Package/getPackages) gibt alle Java-Pakete zurück, die für import verfügbar sind, jedoch nur die Clojure-Namespaces, die bereits verwendet werden.

Dann stieß ich auf this post, aber es nutzt einige Classpath Magie.

Also ich möchte etwas wie ('clojure.core 'clojure.set ... 'clojure.contrib.accumulators 'clojure.contrib.condition ...) bekommen, wenn ich die clojure.jar und contrib.jar auf meinem Classpath habe, aber ich habe noch nichts benutzt.

Antwort

9

Sie müssen „Classpath Magie“ zu tun. Da es keine Art von Registrierung gibt, müssen Sie den Klassenpfad durchlaufen und in jeder clojure-Quelldatei nachsehen, welche Namespaces verfügbar sind. (Für den Fall, dass die Dateien nicht AOT kompiliert werden. Andernfalls benötigen Sie eine andere Heuristik.)

Ich denke, die Funktion in der verknüpften Post verwendet wird, ist der beste Weg zu gehen: clojure.contrib.find-namespaces/find-namespaces-on-classpath.


Veraltet seit Clojure 1.3.0; benutze jetzt clojure.tools.namespace.find/find-namespaces und clojure.java.classpath/classpath von http://github.com/clojure/java.classpath

2

Ich habe bultitude gefunden, um ein großartiges Werkzeug dafür zu sein.

Beispiel:

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

die perfekte Ergänzung zu meiner Frage sieht –

Verwandte Themen