(;module: lux (lux (data (coll [list "L/" Functor Fold]))) (luxc (lang ["la" analysis] ["ls" synthesis]))) (def: #export (environment scope) (-> Scope (List ls;Variable)) (|> scope (get@ [#;captured #;mappings]) (L/map (function [[_ _ ref]] (case ref (#;Local idx) (nat-to-int idx) (#;Captured idx) (|> idx n.inc nat-to-int (i.* -1)) ))))) (do-template [ ] [(def: #export ( var) (-> ls;Variable Bool) ( 0 var))] [self? i.=] [local? i.>] [captured? i.<] ) (do-template [ ] [(def: #export ( arity) (-> ls;Arity Bool) ( arity))] [nested? n.> +1] [top? n.= +0] ) (def: #export (adjust-var outer var) (-> ls;Arity ls;Variable ls;Variable) (|> outer n.dec nat-to-int (i.+ var))) (def: #export (to-captured idx) (-> Nat Int) (|> idx n.inc nat-to-int (i.* -1))) (def: #export (captured-idx idx) (-> Int Nat) (|> idx (i.* -1) int-to-nat n.dec)) (def: #export (to-local idx) (-> Nat Int) (nat-to-int idx)) (def: #export (unfold-apply apply) (-> la;Analysis [la;Analysis (List la;Analysis)]) (loop [apply apply args (list)] (case apply (#la;Apply arg func) (recur func (#;Cons arg args)) _ [apply args])))