有没有if-clojurescript宏?

时间:2013-03-01 18:59:49

标签: clojure clojurescript

是否有一个用于clojure和clojurescript的宏,它允许你根据文件是用clojure还是clojurescript编译来插入不同的表达式?

(if-clojurescript
   (my clojurescript definition)
   (my clojure definition))

基本上我正在寻找类似#ifdef SOME_PLATFORM宏的东西,你可能会看到围绕c ++代码。我认为这对于我希望成为交叉的一部分的文件很有用,但是该文件的一小部分在clojure / clojure-script之间不兼容。

4 个答案:

答案 0 :(得分:3)

您可以查看*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"

如果您无法将语言中性位拆分为自己的文件(这是首选),这可能很有用。我的个人意见倾向于避免使用太多这样的东西。

 (defmacro if-clojurescript [clj-form cljs-form]
    (if *clojure-version* clj-form cljs-form))

答案 1 :(得分:3)

不是真正的宏,而是一个Leiningen插件,它根据源中放置的元数据注释生成Clojure或ClojureScript代码:cljx

答案 2 :(得分:3)

这是Clojure 1.7的新功能:Reader conditionals

另见Daniel Compton blog,例如:

#?(:clj  (Clojure expression)
   :cljs (ClojureScript expression)
   :clr  (Clojure CLR expression))

您可能还想查看macrovitch

答案 3 :(得分:2)

有一些名为Feature Expressions的失效工作用于实现在同一代码库中支持Clojure的不同变体的一般机制。