(;module: lux (lux (control monad) (data text/format) [macro #+ Monad "Lux/" Monad] [host #+ jvm-import]) (luxc ["&" base] (lang ["la" analysis] ["ls" synthesis]) ["&;" analyser] ["&;" synthesizer] (compiler ["&;" common]))) (jvm-import #long java.lang.Object) (jvm-import org.objectweb.asm.Opcodes) (jvm-import org.objectweb.asm.MethodVisitor (visitLdcInsn [Object] void)) (def: unit-value Text "\u0000unit\u0000") (def: (compiler-literal value) (-> Top (Lux &common;Compiled)) (do Monad [visitor &common;get-visitor #let [_ (MethodVisitor.visitLdcInsn [(:! java.lang.Object value)])]] (wrap []))) (def: (compile-synthesis synthesis) (-> ls;Synthesis (Lux &common;Compiled)) (case synthesis #ls;Unit (compiler-literal &common;unit-value) (^template [] ( value) (compiler-literal value)) ([#ls;Bool] [#ls;Nat] [#ls;Int] [#ls;Deg] [#ls;Real] [#ls;Char] [#ls;Text]) _ (macro;fail "Unrecognized synthesis."))) (def: (eval type code) &;Eval (undefined)) (def: analyse &;Analyser (&analyser;analyser eval)) (def: #export (compile input) (-> Code (Lux &common;Compiled)) (do Monad [analysis (analyse input)] (compile-synthesis (&synthesizer;synthesize analysis))))