2009-02-26 5 views
12

Я понимаю, что вы можете легко смешивать groovy & java, clojure & java, whateverJvmLang & java.Можете ли вы смешивать языки JVM? т.е.: Groovy & Clojure

Означает ли это, что я также могу взаимодействовать с clojure и groovy кодом? Если я использую Grails или jRoR, могу ли я также использовать clojure в этой среде?

ответ

14

Пока языки на самом деле производят классы Java (то есть: классы, которые известны платформе Java, не обязательно написанные на языке Java), то да: они могут легко взаимодействовать друг с другом.

По крайней мере, для Groovy Я знаю, что вполне возможно писать классы, которые могут использоваться из «нормального» Java-кода.

+0

Также можно использовать Clojure генерироваться классами в Java коде, и наоборот: так что весь Clojure <-> Java <-> Groovy путь должен работать – mikera

14

Clojure можно скомпилировать в .class файлы через gen-class и использовать с Java, как и любой другой код; см. here.

2

Как уже упоминалось, вы можете получить доступ к классам Clojure из Groovy с помощью предварительной компиляции.

Вы можете получить доступ к наиболее популярным скриптам через API скриптов Java 6, хотя Scala и Clojure официально не поддерживаются. Вот примеры из Groovy:

http://groovy.codehaus.org/JSR-223+access+to+other+JVM+languages

Вы также можете получить доступ к классам Clojure от Groovy, например, (Для 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) 
    } 
} 

Существует также плагин Clojure для Grails, который обеспечивает легкий доступ для выполнения Clojure код из любого артефакта Grails (контроллеры, библиотеки тегов, услуги и т.д ...):

HTTP:// grails.org/plugin/clojure

+0

только прокомментировать Грааль плагина части и сказать, что я использовал плагин в производстве без гроша и большой радости. –

3

Как уже отмечалось, Clojure ча n легко взаимодействует с Java. Хотя многие из примеров, которые вы видите, показывают, как это сделать из REPL, как только вы скомпилируете Clojure или любой другой язык JVM в файл класса или jar, его можно вызывать на Java, как и любой другой класс.

В моем случае сложность (не большая часть) заключалась в том, чтобы правильно использовать gen-class. Существует небольшой набор статистических функций, написанных в Clojure на http://kenai.com/projects/binomialstats, который иллюстрирует, как это сделать. Эта библиотека Clojure используется проектом Java - signtest. (Извините, поскольку я новичок, StackOverflow не позволяет мне публиковать несколько ссылок.)

Что было бы действительно лучше, если бы некоторые из IDE могли иметь дело с разными языками в одном проекте. Два упомянутых выше проекта поддерживаются, например, как два отдельных проекта NetBeans. Обеспечение того, что две части всегда синхронизированы, может быть немного дополнительной работой.