There are a number of ways to mix Groovy and Clojure. You can access Clojure classes from Groovy and vice versa by pre-compiling.
You can access via Java 6's scripting API: JSR-223 access to other JVM languages
You can also get access to Clojure's classes from Groovy, e.g. (for Groovy 1.7 snapshot):
@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 }
Or interact via creating a new Process (again for Groovy 1.7 snapshot):
@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) } }
Another option is to use the Clojure API like this:
@Grab(group='org.clojure', module='clojure', version='1.0.0') import clojure.lang.Compiler import clojure.lang.RT def src = new File('temp.clj') src.text = ''' (ns groovy) (defn factorial [n] (if (< n 2) 1 (* n (factorial (- n 1))))) ''' src.withReader { reader -> Compiler.load reader } def fac = RT.var('groovy', 'factorial') println fac.invoke(5)
There is also a Clojure plugin for Grails which provides easy access to execute clojure code from any Grails artifact (controllers, taglibs, services etc...): http://grails.org/plugin/clojure
Not to be left behind Griffon also sports a clojure plugin, based on the Grails one: http://griffon.codehaus.org/Clojure+Plugin. Among it's features you'll find: script loading at runtime (like Grails), class generation using clojure's macros and a repl.