是否存在if clojurescript宏?
Clojure和ClojureScript是否有一个宏,允许您插入不同的表达式,具体取决于文件是用Clojure还是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
(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的链接!