X-Git-Url: https://git.hcoop.net/hcoop/domtool2.git/blobdiff_plain/57e066bb6c8ab3b21df9d16d35f6877659bf868b..e140629ff492a6440c7b0d892d27ed443a2f9cd9:/src/env.sml diff --git a/src/env.sml b/src/env.sml index ef710c1..3b08094 100644 --- a/src/env.sml +++ b/src/env.sml @@ -1,5 +1,6 @@ (* HCoop Domtool (http://hcoop.sourceforge.net/) * Copyright (c) 2006, Adam Chlipala + * Copyright (c) 2014 Clinton Ebadi * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -149,6 +150,16 @@ fun three func (name1, arg1, name2, arg2, name3, arg3) f (_, [e1, e2, e3]) = SM.empty)) | three func _ _ (_, es) = badArgs (func, es) +fun four func (name1, arg1, name2, arg2, name3, arg3, name4, arg4) f (_, [e1, e2, e3, e4]) = + (case (arg1 e1, arg2 e2, arg3 e3, arg4 e4) of + (NONE, _, _, _) => badArg (func, name1, e1) + | (_, NONE, _, _) => badArg (func, name2, e2) + | (_, _, NONE, _) => badArg (func, name3, e3) + | (_, _, _, NONE) => badArg (func, name4, e4) + | (SOME v1, SOME v2, SOME v3, SOME v4) => (f (v1, v2, v3, v4); + SM.empty)) + | four func _ _ (_, es) = badArgs (func, es) + fun noneV func f (evs, []) = (f evs; SM.empty) | noneV func _ (_, es) = badArgs (func, es) @@ -189,6 +200,7 @@ fun action_none name f = registerAction (name, none name f) fun action_one name args f = registerAction (name, one name args f) fun action_two name args f = registerAction (name, two name args f) fun action_three name args f = registerAction (name, three name args f) +fun action_four name args f = registerAction (name, four name args f) fun actionV_none name f = registerAction (name, fn (env, _) => (f env; env)) fun actionV_one name args f = registerAction (name, oneV name args f) @@ -200,26 +212,39 @@ fun container_one name args (f, g) = registerContainer (name, one name args f, g fun containerV_none name (f, g) = registerContainer (name, noneV name f, g) fun containerV_one name args (f, g) = registerContainer (name, oneV name args f, g) -type env = SS.set * (typ * exp option) SM.map * SS.set -val empty : env = (SS.empty, SM.empty, SS.empty) +type env = SS.set * (typ * exp option) SM.map * SS.set * (typ * exp) SM.map +val empty : env = (SS.empty, SM.empty, SS.empty, SM.empty) + + +fun initialDynEnvTypes (_, _, _, ds) = + SM.map (fn (t, e) => t) ds -fun lookupType (ts, _, _) name = SS.member (ts, name) -fun lookupVal (_, vs, _) name = +fun initialDynEnvVals (_, _, _, ds) = + SM.map (fn (t, v) => v) ds + +fun lookupType (ts, _, _, _) name = SS.member (ts, name) +fun lookupVal (_, vs, _, _) name = case SM.find (vs, name) of NONE => NONE | SOME (t, _) => SOME t -fun lookupEquation (_, vs, _) name = +fun lookupEquation (_, vs, _, _) name = case SM.find (vs, name) of NONE => NONE | SOME (_, eqo) => eqo -fun lookupContext (_, _, cs) name = SS.member (cs, name) +fun lookupContext (_, _, cs, _) name = SS.member (cs, name) +fun lookupInitialDynEnvVal (_, _, _, ds) name = + case SM.find (ds, name) of + NONE => NONE + | SOME (t, _) => SOME t -fun bindType (ts, vs, cs) name = (SS.add (ts, name), vs, cs) -fun bindVal (ts, vs, cs) (name, t, eqo) = (ts, SM.insert (vs, name, (t, eqo)), cs) -fun bindContext (ts, vs, cs) name = (ts, vs, SS.add (cs, name)) +fun bindType (ts, vs, cs, ds) name = (SS.add (ts, name), vs, cs, ds) +fun bindVal (ts, vs, cs, ds) (name, t, eqo) = (ts, SM.insert (vs, name, (t, eqo)), cs, ds) +fun bindContext (ts, vs, cs, ds) name = (ts, vs, SS.add (cs, name), ds) +fun bindInitialDynEnvVal (ts, vs, cs, ds) (name, t, eqn) = (ts, vs, cs, SM.insert (ds, name, (t, eqn))) -fun types (ts, _, _) = ts -fun vals (_, vs, _) = SM.foldli (fn (name, _, vs) => SS.add (vs, name)) SS.empty vs -fun contexts (_, _, cs) = cs +fun types (ts, _, _, _) = ts +fun vals (_, vs, _, _) = SM.foldli (fn (name, _, vs) => SS.add (vs, name)) SS.empty vs +fun contexts (_, _, cs, _) = cs +fun dynamics (_, _, _, ds) = SM.foldli (fn (name, _, ds) => SS.add (ds, name)) SS.empty ds end