5

是否有 Clojure 和 ClojureScript 的宏允许您根据文件是在 Clojure 还是 Clojurescript 中编译来插入不同的表达式?

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

本质上,我正在寻找类似于#ifdef SOME_PLATFORM您可能会看到散布在 C/C++ 代码周围的宏之类的东西。我认为它对于我想成为交叉部分的文件可能很有用,但该文件的一小部分在 Clojure/ClojureScript 之间不兼容。

4

4 回答 4

4

这是 Clojure 1.7 的一个新特性:阅读器条件

另请参阅Daniel Compton 博客,例如:

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

您可能还想看看macrovitch

于 2015-10-26T22:32:35.413 回答
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))
于 2013-03-01T19:09:29.140 回答
3

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

于 2013-03-02T10:56:07.827 回答
2

有一些停滞不前的工作称为特征表达式,以实现在同一代码库中支持不同 Clojure 变体的通用机制。

于 2013-03-01T20:44:36.400 回答