exception VarUndef of string

let genv = ref []
	     
let eval_expr = 
  let rec eval_rec env = function
      Cst x -> x
    | Var x -> 
	(try List.assoc x env with 
	     Not_found -> 
	       try List.assoc x !genv with
		   Not_found -> raise(VarUndef x))
    | Sum(e1,e2) -> (eval_rec env e1) + (eval_rec env e2)
    | Diff(e1,e2) -> (eval_rec env e1) - (eval_rec env e2)
    | Prod(e1,e2) -> (eval_rec env e1) * (eval_rec env e2)
    | Quot(e1,e2) -> (eval_rec env e1) / (eval_rec env e2)
    | Letin(x,e1,e2) -> let t = eval_rec env e1 in eval_rec ((x,t)::env) e2
  in 
    eval_rec []
      
      
let eval_instr = function
    Set(x,e) -> genv := (x,eval_expr e)::!genv
  | Print(e) -> Printf.printf "= %d" (eval_expr e)