Scala和Clojure都在一个项目中

时间:2012-03-13 00:39:27

标签: scala clojure interop jvm-languages

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

我知道interop between them is possible,因为它们都在同一个Java VM上运行,并且都被编译为相同的字节码。 但是有一些麻烦:

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

( 是的,是的,我知道我可以用一种语言插入jar来投射其他语言。)

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

4 个答案:

答案 0 :(得分:17)

简短的缩写:使用Maven3

maven3与clojure的zi插件和maven-scala-plugin将允许你有一个很好地集成的多语言项目,你可以使用任何你想要的语言,只要它的Java;)

Maven3的一个重大变化是推动多语言JVM编程,包括以多种语言编写POM的能力。虽然你获得了丰厚的回报,但是当你走这条路线时,你会失去莱宁根的光彩。

答案 1 :(得分: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 install'lein-antlr4插件。如果您不需要它,只需从项目定义中删除相关的行。

要使用Scala插件我需要download并更改

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

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

在插件的project.clj中,然后在本地“lein install”。随着旧的依赖版本我得到了

java.lang.Error: typeConstructor inapplicable for <none>

来自Scala编译器。

答案 2 :(得分:3)

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

答案 3 :(得分:3)

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

可以使用SBT编译Clojure,因为SBT非常灵活,但更实际的是,没有Clojure编译支持随时可用。您可以查看this plugin作为如何添加其他语言编译的示例。

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