2012-12-19 10 views
6

Sto scrivendo del codice che deve memorizzare i dati sullo spazio dei nomi corrente. Il mio codice sta generando un'ontologia e ho bisogno di assegnare gli URI che devono persistere tra le invocazioni dei clojure. Questi URI vengono generati automaticamente, quindi non è solo il caso degli autori del codice che li scrivono.In clojure, come ottengo il nome del file dello spazio dei nomi corrente?

Ho pensato di utilizzare un meccanismo simile al modo in cui Emacs memorizza i dati; generando alcuni moduli chiari e salvandoli in un file. Questi possono quindi essere valutati all'inizio del clojure e tutti sono felici. Il problema quando si usano strumenti come leningen, questi file finiranno nella directory root.

Posso costruire contro convenzioni di directory standard, ma preferirei ottenere i dati direttamente dal clojure; So che il compilatore aggiunge i dati di localizzazione di origine al clojure; c'è un modo in cui posso accedermi da solo?

+0

Puoi spiegare in maggior dettaglio perché non vuoi mantenere i dati "salvati" nella directory principale? Puoi leggerlo e valutare dal clojure. –

+0

I dati che tengo salvati saranno in parte leggibili. Ha più senso per me, per tenerlo con il file a cui si riferisce. Sarà versione con esso. –

risposta

12

Se stai cercando lo spazio dei nomi in cui il codice è attualmente in esecuzione in fase di esecuzione, allora si può semplicemente guardare il valore della clojure.core/*ns*:

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

Se stai cercando per il file in cui un var o dello spazio dei nomi è stato definito, quindi la posizione del codice sorgente a cui ti riferisci è memorizzato dal compilatore come metadati sulla var quando si valuta una forma def:

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

il "NO_SOURCE_FILE" è perché si sta valutando una forma entra ed in REPL. Se valuti il ​​codice da un file sorgente, allora :file punterà al nome del percorso del file sorgente.

+0

Hmmm. Questo mi ha fatto chiedere se ci sono metadati nello stesso spazio dei nomi, ma lo spazio dei nomi in realtà non associa un simbolo. Penso che tu abbia fatto un buon punto, e che cosa dovrei fare, è probabile che fallisca se eseguo codice in un REPL. Uno spazio dei nomi non viene mappato direttamente su un file, anche se sembra. –

+0

Puoi passare da un simbolo ad uno spazio dei nomi usando '(the-ns 'clojure.core)', e puoi ottenere/impostare i metadati sul ns ... ma il compilatore non sembra aggiungere il file sorgente come metadati al ns. – Alex

Problemi correlati