(;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))] [function-var? i.=] [local-var? i.>] [captured-var? i.<] ) (def: #export (nested-function? scope-args) (-> Nat Bool) (n.> +1 scope-args)) (def: #export (adjust-var scope-args var) (-> Nat ls;Variable ls;Variable) (|> scope-args n.dec nat-to-int (i.+ var))) (def: #export (to-captured idx) (-> Nat Int) (|> idx n.inc nat-to-int (i.* -1))) (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])))