有时你想粘合用不同JVM语言编写的解决方案.为此,您需要调用该语言或以某种方式使用java bitecodes.Clojure中最纯粹,最安全,最好的方法是什么?
例如,从Clojure调用Scala的最佳方法是什么?
(我知道其他方法很容易.你可以通过gen-class生成.class你可以混合使用JVM语言吗?即:Groovy和Clojure,但这只是允许你使用其他语言的clojure.)
raj*_*ter 12
由于Clojure在JVM上运行,因此您可以访问Clojure中类路径上的任何已知类.这是一个Scala示例.为了简化类路径设置和依赖关系管理,请使用Leiningen生成项目.
lein new clojure-scala
Run Code Online (Sandbox Code Playgroud)
在项目文件夹中,修改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" )
Run Code Online (Sandbox Code Playgroud)
创建目录scala-src,并在该文件夹中创建以下Scala类:
class HelloWorld {
def sayHelloToClojure(msg: String) =
"Here's the echo message from Scala: " concat msg
}
Run Code Online (Sandbox Code Playgroud)
使用scalac编译类.现在运行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"
Run Code Online (Sandbox Code Playgroud)
这与您使用Scala类和Java代码的方式兼容.这可能会变得棘手,引用常见问题 - 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)
Run Code Online (Sandbox Code Playgroud)
基本上,使用这些技术,您可以调用任何其他语言来创建JVM类(包括Java,Scala和可能大多数其他JVM语言)