(;module: lux (lux (control monad ["ex" exception #+ exception:] ["p" parser]) (data ["e" error] text/format) [meta] (meta ["s" syntax])) (luxc ["&" base] (lang ["ls" synthesis]) ["&;" analyser] ["&;" synthesizer] (synthesizer [";S" function]) (generator ["&;" common] ["&;" primitive] ["&;" structure] ["&;" eval] ["&;" procedure] ["&;" function] ["&;" reference] [";G" case] (host ["$" jvm])))) (exception: #export Unrecognized-Synthesis) (def: #export (generate synthesis) (-> ls;Synthesis (Meta $;Inst)) (case synthesis [_ (#;Tuple #;Nil)] &primitive;generate-unit (^ [_ (#;Tuple (list 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]) (^ [_ (#;Form (list [_ (#;Nat tag)] [_ (#;Bool last?)] valueS))]) (&structure;generate-variant generate tag last? valueS) [_ (#;Tuple members)] (&structure;generate-tuple generate members) (^ [_ (#;Form (list [_ (#;Int var)]))]) (if (functionS;captured? var) (&reference;generate-captured var) (&reference;generate-variable var)) [_ (#;Symbol definition)] (&reference;generate-definition definition) (^ [_ (#;Form (list [_ (#;Text "lux let")] [_ (#;Nat register)] inputS exprS))]) (caseG;generate-let generate register inputS exprS) (^ [_ (#;Form (list [_ (#;Text "lux case")] inputS pathPS))]) (caseG;generate-case generate inputS pathPS) (^multi (^ [_ (#;Form (list [_ (#;Text "lux function")] [_ (#;Nat arity)] [_ (#;Tuple environment)] bodyS))]) [(s;run environment (p;some s;int)) (#e;Success environment)]) (&function;generate-function generate environment arity bodyS) (^ [_ (#;Form (list& [_ (#;Text "lux call")] functionS argsS))]) (&function;generate-call generate functionS argsS) (^ [_ (#;Form (list& [_ (#;Text procedure)] argsS))]) (&procedure;generate-procedure generate procedure argsS) _ (&;throw Unrecognized-Synthesis (%code synthesis)) ))