(.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)))))