2017-02-13 64 views
2

我在一个JavaScript库(PRNG)中编写了一些包装宏。 然后我想提供这个宏跨平台提供的功能。 (即我想为JVM有不同的这个宏的实现)。在Clojure(脚本)中编写跨平台宏的正确方法是什么?

在Clojure中使用它的正确方法是什么?

或者我可以只有一个宏在编译时检测它是否被用于JVM或JS并返回相应的代码?

+1

我想读者条件和'cljc'是你所需要的。 https://clojure.org/guides/reader_conditionals。您可以为不同的目标平台定义宏的不同实现,并且编译器将根据使用的目标读取正确的版本。 – leetwinski

+2

不,阅读器条件通常不适合跨平台,因为ClojureScript宏是用Clojure编写的,所以平台指示符将被设置为:clj,而不是:cljs。请注意,宏真正关心WRITING代码,而不是阅读它(这是读者条件有用的地方)。 –

回答

2

请注意,在ClojureScript中,宏是用Clojure编写的(就像在Clojure中一样)。 [撇开自托管的ClojureScript的皱纹。]因此,无论哪种情况,阅读器条件只会采用宏代码中的:clj分支。

这是一个正在讨论的议题。这里相关话题和票务:

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

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