(;module: lux (lux (data (coll [list "list/" Functor])))) (def: #export Variable Int) (def: #export Register Nat) (def: #export (captured register) (-> Register Variable) (|> register n.inc nat-to-int (i.* -1))) (def: #export (local register) (-> Register Variable) (nat-to-int register)) (def: #export (local-register variable) (-> Variable Register) (int-to-nat variable)) (def: #export (captured-register variable) (-> Variable Register) (|> variable (i.* -1) int-to-nat n.dec)) (do-template [ ] [(def: #export ( var) (-> Variable Bool) ( 0 var))] [self? i.=] [local? i.>] [captured? i.<] ) (def: #export (from-ref ref) (-> Ref Variable) (case ref (#;Local register) (local register) (#;Captured register) (captured register))) (def: #export (environment scope) (-> Scope (List Variable)) (|> scope (get@ [#;captured #;mappings]) (list/map (function [[_ [_ ref]]] (from-ref ref)))))