在本文撰写之时,CLJX已经被CLJC所取代,因此这个问题不再有任何有用的答案了。
下面是一个典型的问题:--如何在来自同一个项目的ClojureScript中使用Clojure代码?
根据我迄今为止的研究,我的印象是有三种类型的Clojure/Clojurescript文件:
此外,CLJS调用还有引入Clojure代码的两种方法:
这些是做这件事的方法吗?这些在CLJ/CLJS方面是什么样子的?
发布于 2016-12-16 07:07:46
这基本上是对的。如果您的代码位于.cljc文件中,您可以只需要该命名空间,并正常使用.cljs文件中的函数(就像它是一个.cljs文件一样)。如果.cljc有clj/cljs差异,可以使用.cljc文件中的读取器条件对它们进行编码。
也可以在.clj文件中定义宏,然后从.cljs文件中要求并调用宏。
发布于 2016-12-16 07:47:43
这不是真正的答案。我本来打算把它写进评论里的,但是它太长了。我认为你在这里的动机是好的,但我不确定的术语。谈论在clojurescript中使用clojure代码是没有意义的。有一种语言,clojure,一种lisp的方言。它有不同的实现。“原始”实现在Java和JVM之上,一个实现在Javascript之上,另一个实现在CLR (和其他)之上。它们中的代码都是clojure (方言)。
当您有一种在不同平台上实现的语言时,您将得到一些平台差异。一个常见的例子是将字符串转换为整数。在基于JVM的clojure中,使用对象解析字符串并返回整数对象。在Javascript平台上,您可以调用标准的javascript (js)方法parsInt。
如果您只想编写一个可以在这两个平台上工作的函数,您可以将其放入cljc文件中,并使用读取器条件来隔离函数中的平台差异。您的colure和clojurescript都将加载该cljc文件,并且都将得到一个具有相同名称和api的函数。
然而,这些平台之间还有许多其他更微妙的不一致之处。例如,并发原语和扩展协议等。
实际情况是,您不能在clojurescirpt中运行clojure代码。但是,由于方言之间的语法共享,您可能会遇到这样的情况: clojure code和clojurescript代码‘看起来’完全相同,并且可以在任何方言下编译和运行。
当编写同时使用clojure和clojurescript的proram时,当您的代码看起来相同时,您确实不想写两次,当然也不想被迫维护两个版本。在可能的情况下,您需要一个版本,可以包含在您的clojure和clojurescript。一个常见的例子是数据验证库。您希望对服务器和clent都使用相同的验证代码,并且只想维护一组源。
在这个阶段,我认为最简单的方法是只在cljc文件中包含公共代码,即使defn不包含任何读取器条件。但是,您仍然希望将其保持在最低限度--只有需要在两者之间共享的定义。
概念并不是在clojurescript中运行clojure代码--您不能这样做。您要做的是使用clojure方言定义代码,并将其放入一个带有cljc扩展名的文件中,而cljc扩展可以包含在clojure和clojurescript构建过程中。这些代码将被编译成JVM字节码和javascript,并在这两个环境中运行。
一个次要的复杂问题是使用ClojureScript宏。在clojureScript中,与clojure不同,宏必须位于不同的编译“单元”中,这意味着它们必须位于与其他ClojureScript代码不同的文件中。这是因为它们首先被扩展。它们可以位于相同的名称空间中,例如,您可以使用mycode.cljs和mycode.cljc。不能将普通ClojureScirpt代码和ClojureScript宏混合在同一个文件中,因为这意味着它位于同一个编译单元中。
https://stackoverflow.com/questions/41148860
复制相似问题