Reputation: 14479
Is there a macro for Clojure and ClojureScript that would allow you to insert different expressions depending on whether the file is being compiled in Clojure or Clojurescript?
(if-clojurescript
(my clojurescript definition)
(my clojure definition))
Essentially I'm looking for something like the #ifdef SOME_PLATFORM
macros you might see sprinkled around C/C++ code. I think it could be useful for files that I would like to be part of a cross-over, but for which one small part of that file isn't compatible between Clojure/ClojureScript.
Upvotes: 5
Views: 381
Reputation: 18005
This is a new feature from Clojure 1.7 : Reader conditionals.
Also see Daniel Compton blog, for example :
#?(:clj (Clojure expression)
:cljs (ClojureScript expression)
:clr (Clojure CLR expression))
You may also want to look at macrovitch.
Upvotes: 4
Reputation: 308
Not really a macro, but a Leiningen plugin that produces Clojure or ClojureScript code based on a metadata annotations placed in your source: cljx
Upvotes: 3
Reputation: 73225
There is some stalled work called Feature Expressions to implement a general mechanism for supporting different variants of Clojure in the same codebase.
Upvotes: 2
Reputation: 91617
you could check *clojure-version*
user> (if *clojure-version* "I'm Clojure" "I'm ClojureScript")
"I'm Clojure"
cljs.user> (if *clojure-version* "I'm Clojure" "I'm ClojureScript")
"I'm ClojureScript"
This could be useful in cases where you can't split the language neutral bits into their own file (which is preferable). My personal opinion tends towards avoiding using too many of such things.
(defmacro if-clojurescript [clj-form cljs-form]
(if *clojure-version* clj-form cljs-form))
Upvotes: 3