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クラスのエンコード方式について何か知っておく必要があります。