【问题标题】:Scala and Clojure both in one projectScala 和 Clojure 都在一个项目中
【发布时间】:2012-03-29 10:16:50
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 为了减少样板,我不知道任何现有的库。但是在 Clojure 宏和 Scala 隐式转换之间,你可能会走得很远。
  • 不要对一个问题提出多个问题。这对只能回答一部分但不能回答另一部分的人是不公平的,并且接受的答案可能不是一个方面的最佳答案。
  • @DanielC.Sobral 一般来说,我会尽量避免这种情况。出于这个原因,我写了最后一行。正文中的问题描述了我希望在该指南中看到的内容(我希望链接到某个帖子或其他内容)。

标签: sbt leiningen scala clojure interop jvm-languages


【解决方案1】:

简短的分析器:使用 Maven3

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

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

【讨论】:

  • 为此 +1:Maven 非常适合在 JVM 上进行多语言编码。我在 Scala+Maven 方面的经验略少,但它在同一个项目中对 Java 和 Clojure 非常有用。
【解决方案2】:

我没用过,但 Leiningen 有 scalac support

【讨论】:

    【解决方案3】:

    就我个人而言,尽管是公认的答案,我还是不会直接使用 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 插件,我需要 download 并更改

    [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 编译器。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        可以使用 SBT 编译 Clojure,因为 SBT 非常灵活,但更实用的是,没有现成的 Clojure 编译支持。你可以看看this plugin作为例子,了解如何添加其他语言的编译。

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

        【讨论】:

          猜你喜欢
          • 2016-06-13
          • 1970-01-01
          • 2016-02-23
          • 2018-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-15
          相关资源
          最近更新 更多