Можете ли вы смешивать языки JVM? то есть: Groovy & Clojure - PullRequest
12 голосов
/ 26 февраля 2009

Я понимаю, что вы можете легко смешивать Groovy и Java, Clojure и Java, независимо от JvmLang и Java.

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

Ответы [ 6 ]

14 голосов
/ 26 февраля 2009

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

14 голосов
/ 26 февраля 2009

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

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

4 голосов
/ 27 февраля 2009

Существует также пример того, как вы можете вызвать код Clojure из JRuby .

3 голосов
/ 06 октября 2009

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

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

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

2 голосов
/ 28 июля 2009

Как уже упоминалось, вы можете получить доступ к классам 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

1 голос
/ 18 октября 2009

Другая среда, которая облегчает смешивание языков в JVM, - WebSphere sMash (он же Project Zero). Включает в себя:

...