Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to define a clojurescript function in the javascript global namespace at compile time?

I'm looking for a way to define Clojurescript functions in the Javascript global namespace at compile time. What I mean by compile-time is that I want the Clojurescript compiler to output this: function some_fn() { }. I know that this is not idiomatic and everything should reside in a namespace but the environment that I'm in forces me to do this. So, ideally something like (defn ^:global some-fn []) that would work similar to how :export works but ignores the namespace.

I'm aware of the runtime method for defining global functions using goog.global, e.g (set! goog.global.someFunction some-clojure-fn) but this doesn't work in my environment.

like image 895
Frank Versnel Avatar asked Mar 06 '13 22:03

Frank Versnel


2 Answers

Perhaps you could define it in a namespace and then expose it in the window (or GLOBAL or this depending on your environment) object:

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

You should then be able to call foo from the window (which is the global JavaScript namespace in the browser).

Update: As suggested by @TerjeNorderhaug, you can set a variable in the global namespace like this:

(set! js/foo foo)
like image 167
kanaka Avatar answered Oct 20 '22 06:10

kanaka


Setting a javascript var to an anonymous Clojurescript function will define the compiled function in the Javascript global namespace:

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

Calling the function works as expected:

(js/some_fn)

like image 27
Terje Norderhaug Avatar answered Oct 20 '22 06:10

Terje Norderhaug