exception Erreur of string;;
let rec eval env =
  function
    | Var x ->
        begin try List.assoc x env with
        | Not_found -> raise (Erreur ("Variable " ^x^ " libre"))
        end
    | Mes (e, l) ->
        begin match eval env e with
        | Obj p as v ->
            let (x, a) =
              try List.assoc l p
              with Not_found -> raise (Erreur ("Message " ^l^ " not found "))
            in eval ((x, v)::env) a
        | Int 1 -> raise (Erreur "Message ŕ un entier")
        | _ -> assert false
        end
    | Mod (e, l, b) ->
        begin match eval env e with
        | Obj p as v ->
            Obj ((l, b) :: (List.filter (function m, _ -> l <> m) p))
        | Int 1 -> raise (Erreur "Modification d'un entier")
        | _ -> assert false
        end
    | Int n -> Int n
    | Obj p -> Obj p
          ;;
On peut vérifier:
eval [] e;;
- : term = Int 3