Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在clojurescript中使用clojure代码的规范方法_Clojure_Macros_Clojurescript - Fatal编程技术网

在clojurescript中使用clojure代码的规范方法

在clojurescript中使用clojure代码的规范方法,clojure,macros,clojurescript,Clojure,Macros,Clojurescript,在撰写本文时,CLJX在Clojure/Clojurescript中已不存在,已被CLJC取代,因此不再有任何有用的答案 因此,这里有一个典型问题:如何在同一项目的ClojureScript中使用Clojure代码? 根据我目前的研究,我的印象是有三种类型的Clojure/Clojurescript文件: CLJ:纯Clojure CLJC:“有条件”Clojure/ClojureScript CLJS:纯Clojurescript 此外,CLJS调用还存在以下问题: 预计算宏 读者条件句

在撰写本文时,CLJX在Clojure/Clojurescript中已不存在,已被CLJC取代,因此不再有任何有用的答案

因此,这里有一个典型问题:如何在同一项目的ClojureScript中使用Clojure代码?

根据我目前的研究,我的印象是有三种类型的Clojure/Clojurescript文件:

  • CLJ:纯Clojure
  • CLJC:“有条件”Clojure/ClojureScript
  • CLJS:纯Clojurescript
此外,CLJS调用还存在以下问题:

  • 预计算宏
  • 读者条件句

这些是做这件事的“方法”吗?这些在CLJ/CLJS侧看起来像什么?

这基本上是正确的。如果您的代码位于.cljc文件中,您可以只需要该名称空间,并正常使用.cljs文件中的函数(就像它是.cljs文件一样)。如果.cljc具有clj/cljs差异,则可以使用.cljc文件中的读取器条件对这些差异进行编码


或者,您可以在.clj文件中定义宏,然后从.cljs文件中要求并调用宏。

这并不是真正的答案。我本想把它写进评论里,但时间太长了。我认为你在这里的动机是好的,但我不确定术语。在clojurescript中谈论使用clojure代码是没有意义的。有一种语言,clojure,一种lisp方言。它有不同的实现。“原始”实现在Java和JVM之上,一个实现在Javascript之上,另一个实现在CLR之上(以及其他)。它们的代码都是clojure(方言)

当您有一种在不同平台上实现的语言时,您将得到一些平台差异。一个常见的例子是将字符串转换为整数。在基于JVM的clojure中,使用Java Integer对象解析字符串并返回Integer对象。在Javascript平台上,可以调用标准Javascript(js)方法parsInt

如果您只想编写一个可以在两种平台上工作的函数,那么可以将其放入cljc文件中,并使用reader条件来隔离函数中的平台差异。您的colure和clojurescript都将加载该cljc文件,并且最终都会得到一个具有相同名称和api的函数

然而,平台之间还有许多其他更微妙的不一致之处。例如,并发原语和扩展协议等

事实是,您不能在clojurescirpt中运行clojure代码。但是,由于跨方言共享语法,您可能会遇到clojure CoCode和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作为示例。不能在同一个文件中混合使用常规ClojureScript代码和ClojureScript宏,因为这意味着它在同一个编译单元中

这是一个很好的答案,但Alex的答案也提到了宏。如果你提到宏的使用,我会接受的。谢谢好的,增加了一点关于将宏保存在单独的编译单元中的内容。