Можете ли вы смешивать языки JVM? то есть: Groovy & Clojure

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

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

6 ответов

Решение

Пока эти языки фактически создают классы 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. (Извините, поскольку я новичок, Stackru не позволяет мне публиковать несколько ссылок.)

Что действительно было бы хорошо сейчас, так это если бы некоторые 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). Это включает:

Другие вопросы по тегам