(;module: lux (lux (control monad pipe) [io #- run] (concurrency ["A" atom]) (data ["E" error] [text "T/" Eq] text/format (coll [list "L/" Fold Monoid Monad] ["D" dict]) [number] [product]) [macro #+ Monad] [type] (type ["TC" check])) (luxc ["&" base] [lang #*] ["&;" module] ["&;" env]) (. ["&&;" lux])) (def: #export (analyse eval ast) Analyser (case ast (^template [ ] [cursor ( value)] ( cursor value)) ([#;BoolS &&lux;analyse-bool] [#;NatS &&lux;analyse-nat] [#;IntS &&lux;analyse-int] [#;DegS &&lux;analyse-deg] [#;RealS &&lux;analyse-real] [#;CharS &&lux;analyse-char] [#;TextS &&lux;analyse-text]) (^ [cursor (#;TupleS (list))]) (&&lux;analyse-unit cursor) (^ [cursor (#;TupleS (list singleton))]) (analyse eval singleton) (^ [cursor (#;TupleS elems)]) (&&lux;analyse-tuple (analyse eval) cursor elems) [cursor (#;SymbolS reference)] (&&lux;analyse-reference cursor reference) (^ [cursor (#;FormS (list [_ (#;SymbolS ["" "_lux_check"])] type value))]) (&&lux;analyse-check analyse eval cursor type value) (^ [cursor (#;FormS (list [_ (#;SymbolS ["" "_lux_coerce"])] type value))]) (&&lux;analyse-coerce analyse eval cursor type value) (^ [cursor (#;FormS (list [_ (#;NatS tag)] value))]) (&&lux;analyse-variant (analyse eval) cursor tag value) _ (&;fail (format "Unrecognized syntax: " (%ast ast))) ))