Come posso ottenere lo spazio dei nomi Clojurescript all'interno di un programma clojurescript? Voglio fare questo fornire alcune informazioni di debug (deve solo funzionare in modalità dev)Come posso ottenere lo spazio dei nomi Clojurescript all'interno di un programma clojurescript?
risposta
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.
È 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) #"\."))
Si può provare questo
(apply str (drop-last 2 (str `_)))
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.
Grazie! Avevo paura che sarebbe il caso – Zubair