你能混合使用JVM语言吗?即:Groovy& Clojure的

时间:2009-02-26 17:03:09

标签: java groovy jvm clojure mixing

据我所知,你可以轻松地混合使用groovy& java,clojure& java,无论是JvmLang& java。

这是否也意味着我可以使用clojure和groovy代码进行交互?如果我使用Grails或jRoR,我还可以在那个环境中使用clojure吗?

6 个答案:

答案 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)。它包括: