Scala和Clojure在同一个项目中的应用

29
我正在寻找一份关于这两种语言的多语言编程指南。
我知道它们之间的互操作性是可能的,因为它们都在同一个Java虚拟机上运行,并且都编译成相同的字节码。但是有些麻烦:
  • 我可以使用来编译Clojure代码吗?
  • 我可以使用来编译Scala代码吗?
(是的,我知道我可以将一个语言的jar插入到另一个语言的项目中。)
  • 是否有一些库可以帮助我免去编写{{link4:样板}互操作代码}的麻烦?
  • 等等

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


为了减少样板代码,我不知道是否存在任何现有的库。但是在Clojure宏和Scala隐式转换之间,您可能可以走得更远。 - leedm777
请不要在一个问题上问多个问题。这对那些只能回答部分问题的人是不公平的,而且被接受的答案可能并不是某个方面最好的答案。 - Daniel C. Sobral
@DanielC.Sobral 一般来说,我试图避免那种情况。因此,我写了最后一行。正文中的问题描述了我希望在指南中看到的内容(我期望链接到某篇文章或其他内容)。 - om-nom-nom
5个回答

17
The short answer: 使用Maven3。
使用Maven3及其zi插件和maven-scala-plugin,您可以拥有一个良好集成的多语言项目,只要是Java就可以使用任何语言。Maven3的一个重大变化是向Polyglot JVM编程的推进,包括在许多语言中编写POMs的能力。虽然采用此路线时会失去Leiningen的优雅,但您将获得丰富的回报。

+1 for this: Maven在JVM上进行多语言编程非常棒。我对Scala+Maven的经验略少,但它在同一项目中为Java和Clojure提供了出色的支持。 - mikera

9

我没有使用过它,但是Leiningen确实具有scalac支持


6
个人而言,我建议避免直接使用Maven,尽管它被认为是最好的解决方案。下面是一个简单的Leiningen项目定义,其中包括以下内容:
  • 从ANTLR4语法中生成Java源代码(额外的福利);
  • 编译Java源代码;
  • 编译Scala源代码(我喜欢在生成的ANTLR4 Java代码上使用Scala,因为它更简洁、易用);
  • 继续进行Clojure相关工作。
(defproject polyglot "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :plugins [[lein-antlr4 "0.1.0-SNAPSHOT"]
            [lein-scalac "0.1.0"]]
  :dependencies [[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-compile-path "target/antlr4/parser"
  :java-source-paths ["target/antlr4/parser" "src/java"]
  :scala-source-path "src/scala"
  :prep-tasks ["antlr4" "javac" "scalac" "compile"])

要使用ANTLR4插件,请下载并“安装”lein-antlr4插件。如果您不需要它,只需从项目定义中删除相关行。

要使用Scala插件,我需要下载它并进行更改。

[org.scala-lang/scala-compiler "2.9.1"] 

to

[org.scala-lang/scala-compiler "2.10.1"]

在插件的project.clj文件中,然后在本地运行 'lein install' 安装它。使用旧版本依赖库时我遇到了问题。
java.lang.Error: typeConstructor inapplicable for <none>

来自Scala编译器。


3
作为Maven的替代品,Gradle 能够编译两种语言。

3
Scala的Dynamic特性是为了方便与动态类型语言集成而创建的,但是您需要编写自己的转发器。此外,由于Scala 2.10已经有所改变,因此您还需要使用Scala 2.10进行重写。也许实际上,您应该使用Scala 2.10(里程碑2可用)。Scala 2.10 CAT支持也可以帮助您在Scala端进行集成。
您可以使用SBT编译Clojure,因为SBT非常灵活,但更加实用的是,没有现成的Clojure编译支持。您可以查看此插件,以了解如何添加其他语言的编译。
我发现Scala和Clojure之间似乎很少存在集成。它们经常被比较,并且您经常会看到人们说选择其中之一。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接