open Ast Print
+structure SM = StringMap
+
val dmy = ErrorMsg.dummyLoc
-val tInit = (TAction ((CRoot, dmy),
- StringMap.empty,
- StringMap.empty),
- dmy)
+val defaultT : record ref = ref SM.empty
+val defaultV : (unit -> exp) SM.map ref = ref SM.empty
+
+fun registerDefault (name, t, v) =
+ case SM.find (!defaultT, name) of
+ NONE => (defaultT := SM.insert (!defaultT, name, t);
+ defaultV := SM.insert (!defaultV, name, v))
+ | SOME _ => raise Fail "Duplicate default environment variable"
+
+fun tInit () = (TAction ((CRoot, dmy),
+ !defaultT,
+ StringMap.empty),
+ dmy)
if !ErrorMsg.anyErrors then
G
else
- Tycheck.checkFile G tInit prog
+ Tycheck.checkFile G (tInit ()) prog
end
fun basis () =
val files = loop []
val files = Order.order files
in
- foldl (fn (fname, G) => check' G fname) Env.empty files
+ if !ErrorMsg.anyErrors then
+ Env.empty
+ else
+ foldl (fn (fname, G) => check' G fname) Env.empty files
end
fun check fname =
let
val _ = ErrorMsg.reset ()
+ val _ = Env.preTycheck ()
val b = basis ()
in
(Env.empty, NONE)
else
let
- val G' = Tycheck.checkFile b tInit prog
+ val G' = Tycheck.checkFile b (tInit ()) prog
in
(G', #3 prog)
end
if !ErrorMsg.anyErrors then
()
else
- Eval.exec StringMap.empty body'
+ Eval.exec (SM.map (fn f => f ()) (!defaultV)) body'
| NONE => ()
end