7

異なる JVM 言語で記述されたソリューションを接着したい場合があります。そのためには、その言語を呼び出すか、何らかの方法で Java バイトコードを使用する必要があります。Clojureでこれを行うための最も純粋で、最も安全で、最も優れた方法は何ですか?

たとえば、Clojure から Scala を呼び出す最良の方法は何ですか?

(他の方法が簡単であることは知っています。Can you mix the JVM languages? ie: Groovy & Clojureに書かれているように、gen-class で .class を生成できますが、これにより、他の言語から clojure を使用できるようになります。)

4

2 に答える 2

12

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
}

scalacを使用してクラスをコンパイルします。次に、 lein depsを実行して、依存関係をダウンロードします。lein replを実行して、 ClojureREPLを起動します。Scalaクラスをインポートしてインスタンス化し、sayHelloToClojureメソッドを呼び出すことができます。

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

これは、ScalaクラスとJavaからのコードを使用する方法とちょうど互換性があります。それはトリッキーになる可能性があります、よくある質問からの引用-Javaの相互運用性

特にScalaクラスがジェネリックス、ポリモーフィックメソッド、抽象型などの高度な機能を使用している場合、JavaからScalaクラスを使用するのは難しい場合があります。Javaにはそのような言語機能がないため、Scalaクラスのエンコード方式について何か知っておく必要があります。

于 2012-08-21T11:24:58.803 に答える
6

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言語を含む)を呼び出すことができます。

于 2012-08-21T11:25:43.717 に答える