据我所知,你可以轻松地混合使用groovy& java,clojure& java,无论是JvmLang& java。
这是否也意味着我可以使用clojure和groovy代码进行交互?如果我使用Grails或jRoR,我还可以在那个环境中使用clojure吗?
答案 0 :(得分:14)
只要有问题的语言实际上产生Java类(即Java平台已知的类,不一定用Java语言编写),那么是的:它们可以轻松地相互交互。
至少对于Groovy,我知道完全可以编写可以从“普通”Java代码中使用的类。
答案 1 :(得分:14)
Clojure可以通过gen-class
编译为.class文件,并像任何其他代码一样从Java中使用;见here。
答案 2 :(得分:4)
还有一个关于如何call Clojure code from JRuby的例子。
答案 3 :(得分:3)
如前所述,Clojure可以轻松地与Java交互。虽然您看到的许多示例都显示了如何从REPL中执行此操作,但是一旦将Clojure或任何其他JVM语言编译为类或jar文件,就可以像从任何其他类一样从Java调用它。
就我而言,困难(不是很多)正在弄清楚如何正确使用gen-class
。在http://kenai.com/projects/binomialstats的Clojure中编写了一小组统计函数,说明了如何执行此操作。 Clojure库由Java项目使用 - signtest。 (对不起,因为我是新手,StackOverflow不允许我发布多个链接。)
现在真正好的是,如果某些IDE可以在同一个项目中处理不同的语言。例如,上面提到的两个项目被维护为两个单独的NetBeans项目。确保两个部分始终保持同步可能需要额外的工作。
答案 4 :(得分:2)
如前所述,您可以通过预编译从Groovy访问Clojure类。
您也可以通过Java 6的脚本API访问大多数流行的脚本语言,但Scala和Clojure似乎不受官方支持。以下是Groovy的示例:
http://groovy.codehaus.org/JSR-223+access+to+other+JVM+languages
您还可以从Groovy访问Clojure的类,例如(对于Groovy 1.7快照):
@Grab(group='org.clojure', module='clojure', version='1.0.0')
import clojure.lang.*
def ss = StringSeq.create('The quick brown fox')
def done = false
while (!done) {
println ss.first()
ss = ss.next()
done = !ss
}
或通过创建新进程进行交互(再次针对Groovy 1.7快照):
@Grab(group='org.clojure', module='clojure', version='1.0.0')
import clojure.lang.Script
def src = new File('temp.clj')
src.text = '''
(defn factorial [n]
(if (< n 2)
1
(* n (factorial (- n 1)))))
(println (factorial 4))
'''
def path = System.getProperty('user.home') + '/.groovy/grapes/org.clojure/clojure/jars/clojure-1.0.0.jar'
new AntBuilder().with {
java(classname:Script.name, classpath:path) {
arg(value:src.path)
}
}
Grails还有一个Clojure插件,可以从任何Grails工件(控制器,标签库,服务等)轻松访问执行clojure代码:
http:/ / grails.org/plugin/clojure
答案 5 :(得分:1)
另一个有助于在JVM上混合语言的环境是 WebSphere sMash (又名Project Zero)。它包括: