我正在寻找这两种语言的多语言编程指南。
我知道它们之间的互操作是可能的,因为它们都运行在同一个 Java VM 上,并且都被编译成相同的字节码。但是有一些麻烦:
(是的,是的,我知道我可以将一种语言的 jar 插入到另一种语言的项目中。)
- 是否有一些库可以让我免于编写样板互操作代码?
- 等等
所以问题是如何在 Scala 和 Clojure 中设置多语言开发?
我正在寻找这两种语言的多语言编程指南。
我知道它们之间的互操作是可能的,因为它们都运行在同一个 Java VM 上,并且都被编译成相同的字节码。但是有一些麻烦:
(是的,是的,我知道我可以将一种语言的 jar 插入到另一种语言的项目中。)
所以问题是如何在 Scala 和 Clojure 中设置多语言开发?
简短的分析器:使用 Maven3
maven3 与zi clojure 插件和maven-scala-plugin将允许您拥有一个完美集成的多语言项目,您可以在其中使用任何您想要的语言,只要它的 Java ;)
Maven3 的一大变化是推动了多语言 JVM 编程,包括以多种语言编写 POM 的能力。走这条路时,你失去了 leiningen 的光彩,尽管你获得了很多回报。
我没用过,但 Leiningen 确实有scalac support。
就个人而言,尽管是公认的答案,我还是不会直接使用 Maven。这是简单的 Leiningen 项目定义:
(defproject polyglot "0.1.0-SNAPSHOT" :description "FIXME: 写描述" :url "http://example.com/FIXME" :license {:name "Eclipse 公共许可证" :url "http://www.eclipse.org/legal/epl-v10.html"} :plugins [[lein-antlr4 "0.1.0-SNAPSHOT"] [lein-scalac“0.1.0”]] : 依赖 [[org.clojure/clojure "1.5.1"] [org.antlr/antlr4“4.0”] [org.scala-lang/scala-library“2.10.1”]] :warn-on-reflection true :antlr4-source-paths ["antlr4"] :antlr4-options {:package "parser" :listener true} :antlr4-编译路径“目标/antlr4/解析器” :java-source-paths ["target/antlr4/parser" "src/java"] :scala-源路径“src/scala” :prep-tasks ["antlr4" "javac" "scalac" "compile"])
要使用 ANTLR4 插件下载并“安装” lein-antlr4插件。如果您不需要它,只需从项目定义中删除相关行。
要使用 Scala 插件,我需要下载并更改
[org.scala-lang/scala-compiler "2.9.1"]
到
[org.scala-lang/scala-compiler "2.10.1"]
在插件的 project.clj 中,然后在本地“安装”它。使用较旧的依赖版本,我得到了
java.lang.Error: typeConstructor inapplicable for <none>
来自 Scala 编译器。
作为 maven 替代方案:gradle能够编译两种语言。
创建Scala 的Dynamic
trait 是为了更轻松地与动态类型语言集成,但您必须编写自己的转发器。此外,你必须用 Scala 2.10 重写它,因为它已经改变了一点。或许,事实上,您应该使用 Scala 2.10(里程碑 2 可用)。Scala 2.10 CAT 支持还可以帮助您在 Scala 端进行集成。
您可以使用 SBT 编译 Clojure,因为 SBT 非常灵活,但更实用的是,没有现成的 Clojure 编译支持。您可以将此插件视为如何添加其他语言的编译的示例。
我觉得奇怪的是 Scala 和 Clojure 之间似乎存在如此少的集成。它们经常被比较,你会经常看到人们说它选择一个而不是另一个。