let rec eval (t : term) (g : assignment) (s : store) = match t with
Intconstant x -> (Int x, s)
...
- | Variable (var) -> (
+ | Variable (var) -> ((
(* we don't handle cases where g doesn't bind var to any value *)
match List.assoc var g with
| Nonrecursive value -> value
(* we update savedg to bind self_var to rec_closure here *)
let savedg' = (self_var, rec_closure) :: savedg
in Closure (arg_var, body, savedg')
- ), s
+ ), s)
...
| Lambda (arg_var, t2) -> (Closure (arg_var, t2, g), s)
...
let (Int i1, s') = eval t1 g s
in let (Int i2, s'') = eval t2 g s'
in (Int (i1 + i2), s'')
- | Variable (var) -> (
+ | Variable (var) -> ((
(* we don't handle cases where g doesn't bind var to any value *)
match List.assoc var g with
| Nonrecursive value -> value
(* we update savedg to bind self_var to rec_closure here *)
let savedg' = (self_var, rec_closure) :: savedg
in Closure (arg_var, body, savedg')
- ), s
+ ), s)
| Let (var_to_bind, t2, t3) ->
(* evaluate t3 under a new assignment where var_to_bind has been bound to
the result of evaluating t2 under the current assignment *)
let (Int i1, s') = eval t1 g s
in let (Int i2, s'') = eval t2 g s'
in (Int (i1 + i2), s'')
- | Variable (var) -> (
+ | Variable (var) -> ((
(* we don't handle cases where g doesn't bind var to any value *)
match List.assoc var g with
| Nonrecursive value -> value
(* we update savedg to bind self_var to rec_closure here *)
let savedg' = (self_var, rec_closure) :: savedg
in Closure (arg_var, body, savedg')
- ), s
+ ), s)
| Let (var_to_bind, t2, t3) ->
(* evaluate t3 under a new assignment where var_to_bind has been bound to
the result of evaluating t2 under the current assignment *)