Java 你能混合使用JVM语言吗?ie:Groovy&;Clojure

Java 你能混合使用JVM语言吗?ie:Groovy&;Clojure,java,groovy,jvm,clojure,mixing,Java,Groovy,Jvm,Clojure,Mixing,我知道您可以轻松地混合使用groovy和java、clojure和java、whateverJvmLang和java 这是否也意味着我可以让clojure和groovy代码进行交互?如果我使用Grails或jRoR,我还可以在该环境中使用clojure吗?只要所讨论的语言实际生成Java类(即:Java平台已知的类,不一定用Java语言编写),那么是的:它们可以轻松地相互交互 至少对于Groovy,我知道完全可以编写可以从“普通”Java代码中使用的类。Clojure可以通过gen class编

我知道您可以轻松地混合使用groovy和java、clojure和java、whateverJvmLang和java


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

只要所讨论的语言实际生成Java类(即:Java平台已知的类,不一定用Java语言编写),那么是的:它们可以轻松地相互交互


至少对于Groovy,我知道完全可以编写可以从“普通”Java代码中使用的类。

Clojure可以通过
gen class
编译成.class文件,并像其他代码一样从Java中使用;请参阅。

还有一个示例说明了如何使用它。

如前所述,您可以通过预编译从Groovy访问Clojure类

您也可以通过Java6的脚本API访问最流行的脚本语言,尽管Scala和Clojure似乎没有得到官方支持。下面是Groovy的示例:

您还可以从Groovy访问Clojure的类,例如(对于Groovy 1.7快照):

或者通过创建新进程进行交互(同样适用于Groovy 1.7快照):

@Grab(group='org.clojure',module='clojure',version='1.0.0')
导入clojure.lang.Script
def src=新文件('temp.clj')
src.text=“”
(defn阶乘[n]
(如果(
还有一个用于Grails的Clojure插件,它提供了从任何Grails工件(控制器、标记库、服务等)执行Clojure代码的简单访问:


http://grails.org/plugin/clojure

如前所述,clojure可以轻松地与Java交互。尽管您看到的许多示例都说明了如何从REPL执行此操作,但一旦您将Clojure或任何其他JVM语言编译到类或jar文件,就可以像其他任何类一样从Java调用它

在我的例子中,困难(不是很大)在于如何正确使用
gen类。有一小部分统计函数是用Clojure编写的,它演示了如何实现这一点。该Clojure库由一个Java项目——signtest使用。(很抱歉,因为我是新手,StackOverflow不允许我发布多个链接。)


如果一些IDE可以在同一个项目中处理不同的语言,那么现在真正好的是。例如,上面提到的两个项目作为两个单独的NetBeans项目进行维护。确保这两个部分始终同步可能是一项额外的工作。

另一个有助于在JVM上混合语言的环境是(也称为Project Zero)。它包括:

  • 一个用Java编写的PHP引擎,允许
  • 允许的PHP/Groovy桥
也可以在Java代码中使用Clojure生成的类,反之亦然:因此,整个Clojure Java Groovy路径应该可以对grails插件部分进行评论,并说我在生产中使用了该插件,没有任何问题,非常高兴。
@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
}
@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)
    }
}