2013-05-20 4 views

risposta

7

Gli spazi dei nomi non sono di prima classe in ClojureScript come in Clojure. Non c'è assolutamente alcun modo per ottenere lo spazio dei nomi in fase di esecuzione. È possibile ottenere queste informazioni al momento dell'espansione della macro se non si ha paura di accedere ad alcuni interni del compilatore ClojureScript. Probabilmente ci dovrebbe essere un'API per questo - ma non siamo ancora arrivati.

+0

Grazie! Avevo paura che sarebbe il caso – Zubair

6

È possibile ottenere il nome del namespace corrente con questo trucco, che sfrutta :: creazione di un simbolo namespace per voi nello spazio dei nomi corrente:

(namespace ::x) 

Probabilmente non si vuole utilizzare tale valore per qualsiasi cosa, perché se il codice è compilato la rappresentazione interna cambierà. Se si vuole vivere pericolosamente, poi nel browser è possibile accedere all'oggetto js che contiene lo spazio dei nomi in questo modo:

(reduce (fn [ns n] (aget ns n)) 
     js/window 
     (clojure.string/split (namespace ::x) #"\.")) 
+1

Funzionerà con il codice compilato in modalità avanzata di chiusura? – Zubair

+1

@Zubair Appena controllato e funziona effettivamente con la compilazione avanzata. – kamituel

1

Si può provare questo

(apply str (drop-last 2 (str `_))) 
3

Durante l'espansione delle macro è possibile accedere &env e recuperare le informazioni dello spazio dei nomi dalla chiave :ns in questo modo:

(:ns &env) 
(:name (:ns &env)) 

questo funziona solo a macro-ex pansion/compile time e non in fase di runtime.