Frank Versnel
Frank Versnel

Reputation: 373

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.

Upvotes: 7

Views: 3645

Answers (2)

Terje Norderhaug
Terje Norderhaug

Reputation: 3689

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)

Upvotes: 3

kanaka
kanaka

Reputation: 73089

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)

Upvotes: 8

Related Questions