คอมไพล์ ClojureScript ในแอปพลิเคชัน Java

ฉันกำลังพยายามคอมไพล์ String ที่มีโค้ด Clojure Script ใน Java/Groovy ฉันไม่พอใจกับการใช้ "java -jar ...".execute() เลย

มีวิธีใดในการเรียกใช้ไลบรารี clojurescript (เวอร์ชัน 1.8.51) เพื่อคอมไพล์โค้ดหรือไม่

แก้ไข: รวมลิงก์ทั้งสองนี้เข้าด้วยกันฉันจึงได้รับรหัสนี้ (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"
            )
    )

ปัญหาของฉันคือฟังก์ชัน emit ส่งกลับสตริงว่าง :/ มีอะไรที่ฉันทำผิดหรือเปล่า?

แก้ไข 2: วิธีการวิเคราะห์ส่งคืนสิ่งนี้:

{
    :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
}

person MAGx2    schedule 26.04.2016    source แหล่งที่มา


คำตอบ (1)


มันควรจะง่ายมากที่จะเรียก ClojureScript Compiler API จาก Clojure เช่น ตามที่แสดงในคำตอบของ คำถามที่คล้ายกันเกี่ยวกับวิธีการทำจาก Clojure

แต่ตามที่คุณต้องการทำจาก Java หรือ Groovy คุณจะต้องใช้ Clojure Java API บางส่วนเพื่อเรียก Clojure จาก ชวา.

person Piotrek Bzdyl    schedule 27.04.2016
comment
ฉันคิดว่าคุณควรโพสต์เป็นคำถามอื่นเนื่องจากดูเหมือนเป็นปัญหาใหม่ที่คุณกำลังแก้ไขอยู่ ปัญหาในโค้ดของคุณคือคุณกำลังส่งสตริงไปที่ analyze.invoke ในขณะที่ควรเป็นโครงสร้างข้อมูล Clojure ที่เป็นตัวแทนของโค้ด ดังนั้นแทนที่จะส่งสตริงธรรมดา ให้ส่งผลลัพธ์ของการเรียกไปที่ Clojure.read(inputText) - person Piotrek Bzdyl; 29.04.2016
comment
ฉันได้เพิ่ม Clojure.read และลบเครื่องหมายคำพูด - ทุกอย่างใช้งานได้ ขอบคุณ! - person MAGx2; 29.04.2016