2016-04-26 15 views
1

Ich versuche, String kompilieren, die Clojure Script-Code in Java/Groovy enthält. Ich bin nicht wirklich glücklich mit "java -jar ...".execute().Kompilieren Sie ClojureScript in der Java-Anwendung

Gibt es eine Möglichkeit, die Clojurescript-Bibliothek (Version 1.8.51) aufzurufen, um Code zu kompilieren?

Edit: So die Kombination dieser beiden Links, die ich diesen Code bekam (Groovy):

IFn require = Clojure.var("clojure.core", "require"); 
    require.invoke(Clojure.read("cljs.analyzer.api")) 
    require.invoke(Clojure.read("cljs.compiler.api")) 

    IFn emptyEnv = Clojure.var("cljs.analyzer.api", "empty-env") 
    IFn analyze = Clojure.var("cljs.analyzer.api", "analyze") 
    IFn emit = Clojure.var("cljs.compiler", "emit-str") 

    final inputText = "(defn plus [a b] (+ a b))" 
    emit.invoke(
      analyze.invoke(emptyEnv.invoke(), "'$inputText" 
      ) 
    ) 

Mein Problem ist, dass Funktion Rückgabe leerer String emittieren: /. Gibt es irgendetwas, was ich falsch mache?

Edit2: Die Methode analysieren Rückkehr dies:

{ 
    :op :constant, 
    :env {:ns {:name cljs.user}, 
    :context :statement, 
    :locals {}, 
    :fn-scope [], 
    :js-globals ...removed..., 
    :form #object[org.codehaus.groovy.runtime.GStringImpl 0x37816ea6 "'(defn plus [a b] (+ a b))"], 
    :tag any 
} 

Antwort

1

Es sollte sehr einfach sein ClojureScript Compiler API von Clojure zu nennen, zum Beispiel as presented in answers to a similar question on how to do it from Clojure.

Aber wie Sie es von Java oder Groovy tun möchten, müssen Sie einige Clojure Java API for calling Clojure from Java verwenden.

+0

Können Sie sich das Update ansehen? – MAGx2

+1

Ich denke, du solltest es als eine andere Frage posten, da es sich wie ein neues Problem anhört, das du jetzt löst. Das Problem in Ihrem Code ist, dass Sie einen String an 'analyze.invoke' übergeben, während es eine Clojure-Datenstruktur sein sollte, die den Code darstellt. Anstatt die einfache Zeichenfolge zu übergeben, übergeben Sie das Ergebnis des Aufrufs an 'Clojure.read (inputText)'. –

+0

Ich habe Clojure.read hinzugefügt und Zitat entfernt - alles funktioniert. Vielen Dank! – MAGx2