* - Is valid in the given pred
* - Expects an environment compatible with the first record
* - Modifies it according to the second record *)
+ | TNested of pred * pred
+ (* Allow nested configuration, in the form of a function from an action
+ * satisfying the first predicate to an action satisfying the second and
+ * with the same environment variable IO behavior. *)
+
+ | 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 *)
+ | ESkip
+ (* Do-nothing action *)
| ESet of string * exp
(* Set an environment variable *)
| EGet of string * string * exp
| ELocal of exp
(* Local execution; execute the action and then restore the previous
* environment. *)
+ | EWith of exp * exp
+ (* Apply a TNested to an action *)
withtype exp = exp' * position
+datatype decl' =
+ DExternType of string
+ | DExternVal of string * typ
+type decl = decl' * string option * position
+
+type file = decl list * exp option
end