是否存在if clojurescript宏?

是否存在if clojurescript宏?,clojure,macros,clojurescript,reader-macro,Clojure,Macros,Clojurescript,Reader Macro,Clojure和ClojureScript是否有一个宏,允许您插入不同的表达式,具体取决于文件是用Clojure还是ClojureScript编译的 (if-clojurescript (my clojurescript definition) (my clojure definition)) 本质上,我在寻找类似于#ifdef SOME_PLATFORM的宏,您可能会看到这些宏散布在C/C++代码中。我认为它可能对我希望成为交叉的一部分的文件有用,但对于那些文件的一小部分在Clo

Clojure和ClojureScript是否有一个宏,允许您插入不同的表达式,具体取决于文件是用Clojure还是ClojureScript编译的

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

本质上,我在寻找类似于
#ifdef SOME_PLATFORM
的宏,您可能会看到这些宏散布在C/C++代码中。我认为它可能对我希望成为交叉的一部分的文件有用,但对于那些文件的一小部分在Clojure/ClojureScript之间不兼容的文件。

您可以检查
*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))

在同一个代码库中实现支持Clojure不同变体的通用机制需要一些暂停的工作。

实际上不是一个宏,而是一个Leiningen插件,它根据源代码中的元数据注释生成Clojure或ClojureScript代码:

这是Clojure 1.7的一个新功能:

另请参见,例如:

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

您可能还想看看。

这看起来很有希望。但是是否有一种通用的方法来使用/需要宏?Clojurescript似乎需要:使用宏,但这将在clojure中引发错误。如果没有与语言无关的方式来要求宏,我看不出这是如何工作的。您可以将此宏放入它自己的命名空间中,然后使用
require
要求clojure文件中的naemspace和使用
require宏要求CloijureScript文件中的名称空间相同,然后clojure和ClojureScript文件可以更接近(尽管仍然不是)语言中立。谢谢,我没有注意到这一点。请欣赏到macrovitch的链接!