type symbol = string type 'a env = symbol -> 'a type expr = | TUnit (* () *) | TInt of int (* i *) | TAdd of expr * expr (* e1+e2 *) | TSub of expr * expr (* e1-e2 *) | TMul of expr * expr (* e1*e2 *) | TDiv of expr * expr (* e1/e2 *) | TIf of expr * expr * expr (* if e1 then e2 else e3 *) | TVar of symbol (* x *) | TLet of symbol * expr * expr (* let x=e1 in e2 *) | TLetrec of (string * expr * expr) (* let rec f = ... f ... in ... *) | TApp of expr * expr (* e1 e2 *) | TFun of symbol * expr (* fun x -> e *) | TSeq of expr * expr (* e1; e2 *) | TRef of expr (* ref e *) | TDeref of expr (* !e *) | TAffect of expr * expr (* (e1 := e2) *) type value = | VUnit | VInt of int | VFun of (value -> value) | VExp of expr