2012-12-19 11 views
6

Ich schreibe einen Code, der Daten über den aktuellen Namespace speichern muss. Mein Code erzeugt eine Ontologie, und ich muss URIs zuweisen, die zwischen clojure-Aufrufe bestehen bleiben müssen. Diese URIs werden automatisch generiert, es handelt sich also nicht nur um die Codeautoren, die sie schreiben.In clojure, wie bekomme ich den Dateinamen des aktuellen Namespace?

Ich dachte, einen ähnlichen Mechanismus zu verwenden, wie Emacs Daten speichert; indem Sie einige Lisp-Formulare generieren und in einer Datei speichern. Diese können dann ausgewertet werden, wenn clojure startet und alle glücklich sind. Das Problem bei der Verwendung von Tools wie Leningen, diese Dateien landen im Root-Verzeichnis.

Ich kann gegen Standardverzeichniskonventionen bauen, aber ich würde bevorzugen, die Daten direkt von clojure zu erhalten; Ich weiß, dass der Compiler Quellenstandortdaten zu clojure hinzufügt; Gibt es einen Weg, auf den ich selbst zugreifen kann?

+0

Können Sie genauer erklären, warum Sie "gespeicherte" Daten nicht im Stammverzeichnis behalten möchten? Sie können es lesen und von clojure aus bewerten. –

+0

Die Daten, die ich gespeichert habe, sind teilweise für Menschen lesbar. Es macht mir mehr Sinn, es mit der Datei, auf die es sich bezieht, zu behalten. Es wird mit ihm versioniert werden. –

Antwort

12

Wenn Sie für den Namespace freuen, in dem Code zur Zeit zur Laufzeit ausgeführt wird, dann können Sie einfach auf den Wert von clojure.core/*ns* aussehen:

user> (defn which-ns? [] (str *ns*)) 
user> (which-ns?) 
"user" 
user> (ns user2) 
user2> (which-ns?) 
"user2" 

Wenn Sie die Datei gesuchte, in dem ein var oder Namensraum definiert wurde, dann wird der Quellcode Ort, den Sie sich beziehen, durch den Compiler als Metadaten auf dem var gespeichert wird, wenn es eine def Form auswertet:

user> (defn foo [x] (inc x)) 
user> (meta #'foo) 
{:arglists ([x]), :ns #<Namespace user>, :name foo, :line 1, :file "NO_SOURCE_FILE"} 

die „NO_SOURCE_FILE“ ist, weil Sie die Bewertung ein Formular eingeben ed in der REPL. Wenn Sie Code aus einer Quelldatei auswerten, zeigt :file auf den Pfadnamen der Quelldatei.

+0

Hmmm. Das brachte mich dazu, mich zu fragen, ob es irgendwelche Metadaten für den Namensraum selbst gibt, aber der Namensraum bindet kein Symbol. Ich denke jedoch, dass Sie einen guten Punkt gemacht haben - was auch immer ich tue, es wird wahrscheinlich scheitern, wenn ich Code in einer REPL laufen lasse. Ein Namespace wird nicht direkt einer Datei zugeordnet, selbst wenn dies der Fall ist. –

+0

Sie können mit '(the-ns 'clojure.core)' von einem Symbol zu einem Namespace gelangen, und Sie können Metadaten für die ns ... abrufen/setzen, aber der Compiler scheint die Quelldatei nicht als Metadaten hinzuzufügen zu den ns. – Alex

Verwandte Themen