29

我正在寻找这两种语言的多语言编程指南。

我知道它们之间的互操作是可能的,因为它们都运行在同一个 Java VM 上,并且都被编译成相同的字节码。但是有一些麻烦:

  • 我可以使用编译 Clojure 代码吗?
  • 我可以使用编译 Scala 代码吗?

(是的,是的,我知道我可以将一种语言的 jar 插入到另一种语言的项目中。)

所以问题是如何在 Scala 和 Clojure 中设置多语言开发?

4

5 回答 5

17

简短的分析器:使用 Maven3

maven3 与zi clojure 插件和maven-scala-plugin将允许您拥有一个完美集成的多语言项目,您可以在其中使用任何您想要的语言,只要它的 Java ;)

Maven3 的一大变化是推动了多语言 JVM 编程,包括以多种语言编写 POM 的能力。走这条路时,你失去了 leiningen 的光彩,尽管你获得了很多回报。

于 2012-03-13T00:49:55.343 回答
9

我没用过,但 Leiningen 确实有scalac support

于 2012-03-13T12:07:25.467 回答
6

就个人而言,尽管是公认的答案,我还是不会直接使用 Maven。这是简单的 Leiningen 项目定义:

  • 从 ANTLR4 语法生成 Java 源代码(作为奖励);
  • 编译 Java 源代码;
  • 编译 Scala 源代码(我更喜欢在生成的 ANTLR4 Java 代码之上使用 Scala,因为它更简洁且易于使用);
  • 继续 Clojure 的内容。
(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 编译器。

于 2013-05-22T09:49:27.853 回答
3

作为 maven 替代方案:gradle能够编译两种语言。

于 2012-03-13T06:45:40.097 回答
3

创建Scala 的Dynamictrait 是为了更轻松地与动态类型语言集成,但您必须编写自己的转发器。此外,你必须用 Scala 2.10 重写它,因为它已经改变了一点。或许,事实上,您应该使用 Scala 2.10(里程碑 2 可用)。Scala 2.10 CAT 支持还可以帮助您在 Scala 端进行集成。

可以使用 SBT 编译 Clojure,因为 SBT 非常灵活,但更实用的是,没有现成的 Clojure 编译支持。您可以将此插件视为如何添加其他语言的编译的示例。

我觉得奇怪的是 Scala 和 Clojure 之间似乎存在如此少的集成。它们经常被比较,你会经常看到人们说它选择一个而不是另一个。

于 2012-03-13T16:36:41.610 回答