2013-03-06 10 views
7

Szukam sposobu na zdefiniowanie funkcji Clojurescript w globalnej przestrzeni nazw Javascript podczas kompilacji. Co mam na myśli przez czas kompilacji, to że chcę, aby kompilator Clojurescript wyprowadzał to: function some_fn() { }. Wiem, że to nie jest idiomatyczne i wszystko powinno znajdować się w przestrzeni nazw, ale środowisko, w którym się znajduję, zmusza mnie do zrobienia tego. Tak więc, najlepiej jak coś takiego, jak (defn ^:global some-fn []), które działa podobnie do tego, jak działa :export, ale ignoruje przestrzeń nazw.Jak zdefiniować funkcję clojurescript w globalnej przestrzeni nazw javascript podczas kompilacji?

Jestem świadomy metody środowiska wykonawczego do definiowania globalnych funkcji przy użyciu goog.global, np. (set! goog.global.someFunction some-clojure-fn), ale to nie działa w moim środowisku.

+2

Czy zdajesz sobie sprawę, że jeśli opisywanie swoją funkcję z '^: export' można zwrócić się do niego bezpośrednio z javascript? na przykład 'my.name.space.some_fn()' –

+0

Tak, jestem. Obawiam się, że naprawdę chcę, aby była to funkcja najwyższego poziomu, ponieważ nie radzę sobie z plikami name.space.prefix. –

+0

Odpowiedź Kanaki jest tym, o co prosisz. Okno to miejsce, w którym żyjemy na najwyższym poziomie. –

Odpowiedz

8

Być może można zdefiniować go w obszarze nazw, a następnie wystawiać go w oknie (lub GLOBAL lub ten w zależności od środowiska) obiektu:

(defn foo [x] (* 2 x)) 
(aset js/window "foo" myns/foo) ;; where myns is where foo is defined 

Następnie powinno być w stanie wywołać foo z okna (który jest globalną przestrzenią nazw JavaScript w przeglądarce).

Aktualizacja: Jak sugeruje @TerjeNorderhaug, można ustawić zmienną w globalnej przestrzeni nazw, jak ta:

(set! js/foo foo) 
+1

Alternatywnie ustaw globalnie za pomocą '(set! Js/foo foo)' –

2

Ustawianie javascript var do funkcji anonimowy Clojurescript będzie określenie funkcji skompilowany w Javascript globalnej przestrzeni nazw:

(set! js/some_fn (fn []))

Wywołanie funkcji działa zgodnie z oczekiwaniami:

(js/some_fn)

Powiązane problemy