Commit 7ee42f71 authored by Taddeus Kroes's avatar Taddeus Kroes

funclang series5: Added evaluation of monops/binops.

parent fab70057
......@@ -2,9 +2,44 @@
(* Perform all possible beta-reductions on an expression until the normal form
* has been reached *)
let rec eval exp = match exp with
MonopAp (op, e) -> MonopAp (op, eval e)
| BinopAp (op, e1, e2) -> BinopAp (op, eval e1, eval e2)
let rec eval exp =
let get_int_value = function
Num i -> i
| _ -> raise (Failure "Not an integer")
in
let get_bool_value = function
Bool b -> b
| _ -> raise (Failure "Not a boolean")
in
let eval_monop op a = match op with
Neg -> Num (- (get_int_value a))
| Not -> Bool (not (get_bool_value a))
in
let eval_binop op x y = match op with
And | Or ->
let a = get_bool_value x in
let b = get_bool_value y in
(match op with
And -> Bool (a && b)
| Or -> Bool (a || b))
| _ ->
let a = get_int_value x in
let b = get_int_value y in
(match op with
Add -> Num (a + b)
| Sub -> Num (a - b)
| Mul -> Num (a * b)
| Div -> Num (a / b)
| Eq -> Bool (a = b)
| Ne -> Bool (a != b)
| Lt -> Bool (a < b)
| Le -> Bool (a <= b)
| Gt -> Bool (a > b)
| Ge -> Bool (a >= b))
in
match exp with
MonopAp (op, e) -> eval_monop op (eval e)
| BinopAp (op, e1, e2) -> eval_binop op (eval e1) (eval e2)
| Fun (x, e) -> Fun (x, eval e)
| FunAp (Fun (x, Var y), a) when y = x -> eval a (* identity function *)
| FunAp (Fun (y, e), a) -> (* prevent recursion *)
......
#use "ass12.ml";;
#use "ass13.ml";;
(* let a = 1 in b *)
......@@ -68,6 +67,15 @@ let show_eval e =
^ "\nis:\n" ^ (expr2string (eval e)))
;;
(* -5 *)
show_eval (BinopAp (Sub, Num 4, Num 9));;
(* false *)
show_eval (BinopAp (Lt, Num 6, Num 5));;
(* true *)
show_eval (BinopAp (Or, Bool true, Bool false));;
(* fun u -> fun w -> fun a -> a *)
show_eval ass1a;;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment