在 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
分支。
这是一个正在进行的讨论主题。相关线程和票在这里:
- https://groups.google.com/forum/#!msg/clojure-dev/f6ULUVokXrU/3uue5okSAgAJ
- http://dev.clojure.org/jira/browse/CLJ-1750
一种选择是简单地编写两个版本的宏,一个用于 Clojure,一个用于 ClojureScript。另一个是使用一些环境技巧来确定您在哪个平台的上下文中调用宏。有几种方法可以做到这一点。一个例子:
(def ^:private ^:no-doc cljs? (boolean (find-ns 'cljs.analyzer)))
我围绕一个 JavaScript 库 (PRNG) 编写了一些包装器宏。 然后我想使这个宏跨平台提供的功能。 (即我想为 JVM 实现此宏的不同实现)。
在 Clojure 中正确的做法是什么?
或者我可以只用一个宏,在编译时检测它是用于 JVM 还是 JS 和 returns 相应的代码?
请注意,在 ClojureScript 中,宏是用 Clojure 编写的(就像在 Clojure 中一样)。 [撇开 self-hosted ClojureScript 的问题不谈。] 所以 reader 条件语句在任何一种情况下都只会采用宏代码中的 :clj
分支。
这是一个正在进行的讨论主题。相关线程和票在这里:
- https://groups.google.com/forum/#!msg/clojure-dev/f6ULUVokXrU/3uue5okSAgAJ
- http://dev.clojure.org/jira/browse/CLJ-1750
一种选择是简单地编写两个版本的宏,一个用于 Clojure,一个用于 ClojureScript。另一个是使用一些环境技巧来确定您在哪个平台的上下文中调用宏。有几种方法可以做到这一点。一个例子:
(def ^:private ^:no-doc cljs? (boolean (find-ns 'cljs.analyzer)))