X-Git-Url: https://git.hcoop.net/hcoop/domtool2.git/blobdiff_plain/8e965b2da49aab1faef95b25471513498ceca895..1824f573f7f8720514af1dc94d7cfb1de5b15fef:/src/eval.sml diff --git a/src/eval.sml b/src/eval.sml index 7aa8053..6cbeca7 100644 --- a/src/eval.sml +++ b/src/eval.sml @@ -56,58 +56,58 @@ fun findPrimitive e = (name, rev args) end -fun exec evs e = - let - fun exec' evs (eAll as (e, _)) = - case e of - ESkip => SM.empty - | ESet (ev, e) => SM.insert (SM.empty, ev, e) - | EGet (x, ev, e) => exec' evs (Reduce.subst x (lookup (evs, ev)) e) - | ESeq es => - let - val (new, _) = - foldl (fn (e, (new, keep)) => - let - val new' = exec' keep e - in - (conjoin (new, new'), - conjoin (keep, new')) - end) (SM.empty, evs) es - in - new - end - | ELocal (e1, e2) => - let - val evs' = exec' evs e1 - val evs'' = exec' (conjoin (evs, evs')) e2 - in - conjoin (evs, evs'') - end - | EWith (e1, e2) => +fun exec' evs (eAll as (e, _)) = + case e of + ESkip => SM.empty + | ESet (ev, e) => SM.insert (SM.empty, ev, e) + | EGet (x, ev, e) => exec' evs (Reduce.subst x (lookup (evs, ev)) e) + | ESeq es => + let + val (new, _) = + foldl (fn (e, (new, keep)) => + let + val new' = exec' keep e + in + (conjoin (new, new'), + conjoin (keep, new')) + end) (SM.empty, evs) es + in + new + end + | ELocal (e1, e2) => + let + val evs' = exec' evs e1 + val evs'' = exec' (conjoin (evs, evs')) e2 + in + conjoin (evs, evs'') + end + | EWith (e1, e2) => + let + val (prim, args) = findPrimitive e1 + in + case Env.container prim of + NONE => raise Fail "Unbound primitive container" + | SOME (action, cleanup) => let - val (prim, args) = findPrimitive e1 + val evs' = action (evs, args) + val evs'' = exec' evs e2 in - case Env.container prim of - NONE => raise Fail "Unbound primitive container" - | SOME (action, cleanup) => - let - val evs' = action (evs, args) - val evs'' = exec' evs e2 - in - cleanup (); - evs' - end + cleanup (); + evs' end + end - | _ => - let - val (prim, args) = findPrimitive eAll - in - case Env.action prim of - NONE => raise Fail "Unbound primitive action" - | SOME action => action (evs, args) - end + | _ => + let + val (prim, args) = findPrimitive eAll + in + case Env.action prim of + NONE => raise Fail "Unbound primitive action" + | SOME action => action (evs, args) + end +fun exec evs e = + let val _ = Env.pre () val evs' = exec' evs e in