Я понимаю, что вы можете легко смешивать groovy & java, clojure & java, anyJvmLang & java.
Означает ли это, что я также могу взаимодействовать с кодом clojure и groovy? Если я использую Grails или jRoR, могу ли я использовать clojure в этой среде?
Я понимаю, что вы можете легко смешивать groovy & java, clojure & java, anyJvmLang & java.
Означает ли это, что я также могу взаимодействовать с кодом clojure и groovy? Если я использую Grails или jRoR, могу ли я использовать clojure в этой среде?
Пока языки на самом деле производят Java-классы (то есть: классы, которые известны платформе Java, не обязательно написанные на языке Java), тогда да: они могут легко взаимодействовать друг с другом.
По крайней мере для Groovy Я знаю, что вполне возможно писать классы, которые могут быть использованы из "нормального" Java-кода.
Clojure может быть скомпилирован в .class файлы через gen-class
и использоваться с Java, как и любой другой код; см. здесь.
Также есть пример того, как вы можете вызвать Clojure код из JRuby.
Как уже упоминалось, Clojure может легко взаимодействовать с Java. Хотя многие из примеров, которые вы видите, показывают, как это сделать из REPL, после компиляции Clojure или любого другого JVM-языка в файл класса или jar, он может быть вызван из Java, как и любой другой класс.
В моем случае сложность (не так много) заключалась в том, как правильно использовать gen-class
. Существует небольшой набор статистических функций, записанных в Clojure в http://kenai.com/projects/binomialstats, который иллюстрирует, как это сделать. Эта библиотека Clojure используется проектом Java - signtest. (Извините, поскольку я новичок, StackOverflow не позволяет мне размещать несколько ссылок.)
Что действительно было бы хорошо сейчас, если некоторые из IDE могут работать с разными языками в одном проекте. Два упомянутых выше проекта поддерживаются, например, как два отдельных проекта NetBeans. Обеспечение того, что две части всегда синхронизированы, может быть немного дополнительной работой.
Как уже упоминалось, вы можете получить доступ к классам 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
Другая среда, которая облегчает смешивание языков на JVM, WebSphere sMash (также известный как Project Zero). Он включает в себя: