(;module: lux (lux (control monad) (data text/format (coll [list "L/" Functor])) [macro #+ Monad]) (luxc ["&" base] (lang ["la" analysis #+ Analysis] ["ls" synthesis #+ Synthesis]) ["&;" analyser])) (def: #export (synthesize analysis) (-> Analysis Synthesis) (case analysis (^template [ ] [meta ( value)] ( value)) ([#la;Unit #ls;Unit] [#la;Bool #ls;Bool] [#la;Nat #ls;Nat] [#la;Int #ls;Int] [#la;Deg #ls;Deg] [#la;Real #ls;Real] [#la;Char #ls;Char] [#la;Text #ls;Text] [#la;Relative #ls;Relative] [#la;Absolute #ls;Absolute]) [meta (#la;Tuple values)] (#ls;Tuple (L/map synthesize values)) [meta (#la;Variant tag last? value)] (#ls;Variant tag last? (synthesize value)) [meta (#la;Function scope body)] (#ls;Function scope (synthesize body)) [meta (#la;Call func args)] (#ls;Call (synthesize func) (L/map synthesize args)) [meta (#la;Procedure name args)] (#ls;Procedure name (L/map synthesize args)) [meta (#la;Case pattern)] (undefined)))