2013-05-20 20 views

Odpowiedz

7

Przestrzenie nazw nie są pierwszorzędne w ClojureScript, ponieważ są w Clojure. Nie ma absolutnie żadnego sposobu na uzyskanie przestrzeni nazw w czasie wykonywania. Możliwe jest uzyskanie tych informacji w czasie wyodrębniania makro, jeśli nie boisz się dostępu do niektórych wewnętrznych komponentów kompilatora ClojureScript. Prawdopodobnie powinien to być interfejs API - ale jeszcze go nie ma.

+0

Dzięki! Bałem się, że tak będzie. – Zubair

6

można uzyskać nazwę bieżącego nazw z tej sztuczki, która wykorzystuje :: stworzenie przestrzeni nazw symbol dla Ciebie w bieżącym obszarze nazw:

(namespace ::x) 

Prawdopodobnie nie chcesz używać tej wartości za nic, ponieważ jeśli kod zostanie skompilowany, wewnętrzna reprezentacja ulegnie zmianie. Jeśli chcesz żyć niebezpiecznie, a następnie w przeglądarce można wtedy uzyskać dostęp do obiektu js, która posiada nazw takiego:

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

Czy to działa z kodem skompilowanym w trybie zaawansowanym zamknięcia? – Zubair

+1

@Zubair Właśnie sprawdzone i działa z zaawansowaną kompilacją. – kamituel

1

możesz spróbować tej

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

Podczas makro ekspansji można uzyskać dostęp &env i pobierać informacje namespace z klucza :ns jak ten:

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

Zadziała tylko na makro-ex pansion/czas kompilacji, a nie w czasie wykonywania.

Powiązane problemy