(;module: lux (lux (control monad ["ex" exception #+ exception:] ["p" parser]) (data ["e" error] text/format) [meta] (meta ["s" syntax])) (luxc ["&" base] (host ["$" jvm]) (lang ["ls" synthesis] [";L" variable #+ Variable Register]) ["&;" synthesizer] (generator ["&;" common] ["&;" primitive] ["&;" structure] ["&;" eval] ["&;" procedure] ["&;" function] ["&;" reference] [";G" case]))) (exception: #export Unrecognized-Synthesis) (def: #export (generate synthesis) (-> ls;Synthesis (Meta $;Inst)) (case synthesis (^code []) &primitive;generate-unit (^code [(~ singleton)]) (generate singleton) (^template [ ] [_ ( value)] ( value)) ([#;Bool &primitive;generate-bool] [#;Nat &primitive;generate-nat] [#;Int &primitive;generate-int] [#;Deg &primitive;generate-deg] [#;Frac &primitive;generate-frac] [#;Text &primitive;generate-text]) (^code ((~ [_ (#;Nat tag)]) (~ [_ (#;Bool last?)]) (~ valueS))) (&structure;generate-variant generate tag last? valueS) (^code [(~@ members)]) (&structure;generate-tuple generate members) (^ [_ (#;Form (list [_ (#;Int var)]))]) (if (variableL;captured? var) (&reference;generate-captured var) (&reference;generate-variable var)) [_ (#;Symbol definition)] (&reference;generate-definition definition) (^code ("lux let" (~ [_ (#;Nat register)]) (~ inputS) (~ exprS))) (caseG;generate-let generate register inputS exprS) (^code ("lux case" (~ inputS) (~ pathPS))) (caseG;generate-case generate inputS pathPS) (^multi (^code ("lux function" (~ [_ (#;Nat arity)]) [(~@ environment)] (~ bodyS))) [(s;run environment (p;some s;int)) (#e;Success environment)]) (&function;generate-function generate environment arity bodyS) (^code ("lux call" (~ functionS) (~@ argsS))) (&function;generate-call generate functionS argsS) (^code ((~ [_ (#;Text procedure)]) (~@ argsS))) (&procedure;generate-procedure generate procedure argsS) _ (&;throw Unrecognized-Synthesis (%code synthesis)) ))