在 Clojure(Script) 中编写跨平台宏的正确方法是什么?

What is proper way to write crossplatform macros in Clojure(Script)?

我围绕一个 JavaScript 库 (PRNG) 编写了一些包装器宏。 然后我想使这个宏跨平台提供的功能。 (即我想为 JVM 实现此宏的不同实现)。

在 Clojure 中正确的做法是什么?

或者我可以只用一个宏,在编译时检测它是用于 JVM 还是 JS 和 returns 相应的代码?

请注意,在 ClojureScript 中,宏是用 Clojure 编写的(就像在 Clojure 中一样)。 [撇开 self-hosted ClojureScript 的问题不谈。] 所以 reader 条件语句在任何一种情况下都只会采用宏代码中的 :clj 分支。

这是一个正在进行的讨论主题。相关线程和票在这里:

一种选择是简单地编写两个版本的宏,一个用于 Clojure,一个用于 ClojureScript。另一个是使用一些环境技巧来确定您在哪个平台的上下文中调用宏。有几种方法可以做到这一点。一个例子:

(def ^:private ^:no-doc cljs? (boolean (find-ns 'cljs.analyzer)))