(;module: lux (lux (control monad) (data text/format) [macro #+ Monad "Lux/" Monad] [host #+ jvm-import]) (luxc ["&" base] (lang ["la" analysis] ["ls" synthesis]) ["&;" analyser] ["&;" synthesizer] (generator ["&;" common] ["&;" primitive] ["&;" structure]))) (def: #export (generate synthesis) (-> ls;Synthesis (Lux Unit)) (case synthesis #ls;Unit &primitive;generate-unit (^template [ ] ( value) ( value)) ([#ls;Bool &primitive;generate-bool] [#ls;Nat &primitive;generate-nat] [#ls;Int &primitive;generate-int] [#ls;Deg &primitive;generate-deg] [#ls;Real &primitive;generate-real] [#ls;Char &primitive;generate-char] [#ls;Text &primitive;generate-text]) (#ls;Variant tag tail? member) (&structure;generate-variant generate tag tail? member) (#ls;Tuple members) (&structure;generate-tuple generate members) _ (macro;fail "Unrecognized synthesis."))) ## (def: (eval type code) ## &;Eval ## (undefined)) ## (def: analyse ## &;Analyser ## (&analyser;analyser eval)) ## (def: #export (generate input) ## (-> Code (Lux Unit)) ## (do Monad ## [analysis (analyse input) ## #let [synthesis (&synthesizer;synthesize analysis)]] ## (generate-synthesis synthesis)))