(;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)) ([#;Bool &&lux;analyse-bool] [#;Nat &&lux;analyse-nat] [#;Int &&lux;analyse-int] [#;Deg &&lux;analyse-deg] [#;Real &&lux;analyse-real] [#;Char &&lux;analyse-char] [#;Text &&lux;analyse-text]) (^ [cursor (#;Tuple (list))]) (&&lux;analyse-unit cursor) (^ [cursor (#;Tuple (list singleton))]) (analyse eval singleton) (^ [cursor (#;Tuple elems)]) (&&lux;analyse-tuple (analyse eval) cursor elems) [cursor (#;Symbol reference)] (&&lux;analyse-reference cursor reference) (^ [cursor (#;Form (list [_ (#;Symbol ["" "_lux_check"])] type value))]) (&&lux;analyse-check analyse eval cursor type value) (^ [cursor (#;Form (list [_ (#;Symbol ["" "_lux_coerce"])] type value))]) (&&lux;analyse-coerce analyse eval cursor type value) (^ [cursor (#;Form (list [_ (#;Nat tag)] value))]) (&&lux;analyse-variant (analyse eval) cursor tag value) _ (&;fail (format "Unrecognized syntax: " (%ast ast))) ))