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