提问者:小点点

如何从Clojure中很好地调用其他JVM语言?


有时您想粘合用不同JVM语言编写的解决方案。为此,您需要调用该语言或以某种方式使用java位码。在Clojure中最纯粹、最安全、最好的方法是什么?

例如,从Clojure调用Scala的最佳方式是什么?

(我知道另一种方法很容易。你可以通过gen-class生成. class,因为它写在你能混合JVM语言吗?即:Groovy


共2个答案

匿名用户

由于Clojure在JVM上运行,您可以从Clojure访问类路径上的任何已知类。这是一个Scala示例。为了使类路径设置和依赖项管理更容易,请使用Leiningen生成项目。

lein new clojure-scala

在项目文件夹中,修改project. clj并为Scala的语言库添加依赖项,并将scala-src文件夹添加到类路径中:

(defproject clj-scala "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"}
  :dependencies [[org.clojure/clojure "1.3.0"]
                 [org.scala-lang/scala-library "2.7.1"]]
  :compile-path "scala-src" )

创建目录scala-src,并在该文件夹中创建以下Scala类:

class HelloWorld {
  def sayHelloToClojure(msg: String) =
    "Here's the echo message from Scala: " concat msg
}

使用calac编译类。现在运行lein deps下载依赖项。通过运行lein repl启动Clojure REPL。您可以导入Scala类,实例化它并调用sayHelloToClojure方法。

user=> (import HelloWorld)
HelloWorld
user=> (.sayHelloToClojure (HelloWorld.) "Hi there")
"Here's the echo message from Scala: Hi there"

这与您可以Java使用Scala类和代码的方式兼容。这可能会变得棘手,引用自常见问题-Java互操作性:

使用Java中的Scala类可能会变得棘手,特别是如果您的Scala类使用泛型、多态方法或抽象类型等高级特性。由于Java没有这样的语言特性,您必须了解Scala类的编码方案。

匿名用户

从Clojure调用其他JVM语言非常容易-您需要做的就是使用Java互操作语法。

例子:

;; import Java classes
(ns my-ns
  (:import [some.package ClassOne ClassTwo ClassThree]))

;; call a regular method on an object
(.method someObject arg1 arg2)

;; call a constructor
(ObjectToConstuct. arg1 arg2)

;; call a static method
(Math/floor 2.3)

;; Use a static field
(+ 2 Math/PI)

基本上,使用这些技术,您可以调用任何其他创建JVM类的语言(包括Java、Scala和可能大多数其他JVM语言)