open DataStructures
(* A description of a predicate on configuration block stacks *)
-datatype context' =
+datatype pred' =
CRoot
(* The stack is empty. *)
| CConst of string
- (* The given context name is on top of the stack. *)
- | CPrefix of context
- (* Some prefix of the stack matches the context. *)
- | CNot of context
- (* The context does not match. *)
- | CAnd of context * context
- (* Both contexts match. *)
-withtype context = context' * position
+ (* The given pred name is on top of the stack. *)
+ | CPrefix of pred
+ (* Some prefix of the stack matches the pred. *)
+ | CNot of pred
+ (* The pred does not match. *)
+ | CAnd of pred * pred
+ (* Both preds match. *)
+withtype pred = pred' * position
datatype typ' =
TBase of string
(* SML 'a list *)
| TArrow of typ * typ
(* SML -> *)
- | TAction of context * record * record
+ | TAction of pred * record * record
(* An action that:
- * - Is valid in the given context
+ * - Is valid in the given pred
* - Expects an environment compatible with the first record
* - Modifies it according to the second record *)
+
+ | TError
+ (* Marker that something already went wrong, so don't generate further
+ * error messages. *)
+ | TUnif of string * typ option ref
+ (* Unification variable to be determined during type-checking *)
withtype typ = typ' * position
and record = typ StringMap.map
| EList of exp list
(* Basic list constructor *)
- | ELam of string * typ * exp
+ | ELam of string * typ option * exp
(* Function abstraction *)
+ | EVar of string
+ (* Variable bound by a function *)
| EApp of exp * exp
(* Function application *)
| ESet of string * exp
(* Set an environment variable *)
+ | EGet of string * string * exp
+ (* Get an environment variable *)
| ESeq of exp list
(* Monad sequencer; execute a number of commands in order *)
| ELocal of exp