open Env;;

type expression =
  | Int of int
  | Variable of variable
  | Sum of expression * expression
  | Let of variable * expression * expression;;

let rec eval exp env =
  match exp with
    | Int i ->
      i
    | Variable v ->
      lookup v env
    | Sum(e1, e2) ->
      (eval e1 env) + (eval e2 env)
    | Let(v, d, b) ->
      let value_of_d = eval d env in
      let extended_env = bind v value_of_d env in
      eval b extended_env;;

let e = Let("x", Sum(Int 1, Int 2),
            (Sum(Variable "x", Int 5)));;

let v = eval e Env.empty;;

print_int v;;
