% $Id: Environment.oz,v 1.1 2010/03/27 04:50:20 leavens Exp leavens $ % Example of higher-order embedding and also of ADTs declare fun {EmptyEnv} fun {$ Name} raise nameNotDefined(Name) end end end fun {OverrideEnv Env1 Env2} fun {$ Name} try {Env2 Name} catch nameNotDefined(_) then {Env1 Name} end end end local fun {Find Lst X Index} case Lst of nil then ~1 [] H|T then if X == H then Index else {Find T X Index+1} end end end in fun {Extendenv Env Names Vals} fun {$ Name} local I={Find Names Name 1} in if I \= ~1 then {Nth Vals I} else {Env Name} end end end end end fun {ApplyEnv Env Name} {Env Name} end