substitute-uuids := λ(: ctx Context)(: term AST). (: (tail(
(match term (
()
( (App( (Var 'uuid_s) (Var x ) )) (
(while (non-zero ctx) (match ctx (
()
( (CtxBind( rst k v )) (
(if (==( x k )) (tail(
(set term v)
(set ctx rst)
)) (
(set ctx rst)
))
))
( _ (set ctx CtxEOF) )
)))
))
( (App( l r )) (
(set term (App(
(substitute-uuids( ctx l ))
(substitute-uuids( ctx r ))
)))
))
( (Abs( l r tlt )) (
(set term (Abs(
(substitute-uuids( ctx l ))
(substitute-uuids( ctx r ))
tlt
)))
))
( (Asc( l rt )) (
(set term (Asc(
(substitute-uuids( ctx l ))
(close rt)
)))
))
( _ () )
))
(close term)
)) AST[]);
extract-uuids := λ(: sloc AST)(: ctx Context)(: term AST). (: (tail(
(match term (
()
( (App( (Var 'uuid_s) (Var x) )) (tail(
(let id (uuid()))
(let loc (maybe-deref(location-of sloc)))
(map-location( id loc ))
(let lctx (CtxBind( (close ctx) x (Var id) )))
(set ctx lctx)
)))
( (App( l r )) (tail(
(let lctx (maybe-deref(extract-uuids( sloc ctx l ))))
(let rctx (maybe-deref(extract-uuids( sloc lctx r ))))
(set ctx rctx)
)))
( (Abs( l r tlt )) (tail(
(let lctx (maybe-deref(extract-uuids( sloc ctx l ))))
(let rctx (maybe-deref(extract-uuids( sloc lctx r ))))
(set ctx rctx)
)))
( (Asc( l rt )) (tail(
(let lctx (maybe-deref(extract-uuids( sloc ctx l ))))
(set ctx lctx)
)))
( _ () )
))
(close ctx)
)) Context[]);