Commit e74be202 authored by Taddeus Kroes's avatar Taddeus Kroes

funclang series5: Fixed mathematical evaluations combied with variables.

parent c6ffbeba
......@@ -3,27 +3,14 @@
(* Perform all possible beta-reductions on an expression until the normal form
* has been reached *)
let rec eval exp =
let get_int_value = function
Num i -> i
| _ -> raise (Failure "Not an integer")
let eval_monop = function
(Neg, Num i) -> Num (-i)
| (Not, Bool b) -> Bool (not b)
| _ -> raise (Failure "Unknown unary operator")
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
Bool (if op = And then a && b else a || b)
| _ ->
let a = get_int_value x in
let b = get_int_value y in
(match op with
let eval_binop binop = match binop with
(op, Num a, Num b) -> (match op with
(* Arithmethic or relational operation is possible on numbers *)
Add -> Num (a + b)
| Sub -> Num (a - b)
| Mul -> Num (a * b)
......@@ -35,11 +22,16 @@ let rec eval exp =
| Le -> Bool (a <= b)
| Gt -> Bool (a > b)
| Ge -> Bool (a >= b)
| _ -> raise (Failure "Unknown operator"))
| _ -> raise (Failure "Unknown arithmetic/relational operator"))
| (op, Bool a, Bool b) -> (match op with
(* Locical operation is possible on booleans *)
And | Or -> Bool (if op = And then a && b else a || b)
| _ -> raise (Failure "Unknown locical operator"))
| (op, e1, e2) -> BinopAp (op, eval e1, eval e2)
in
match exp with
MonopAp (op, e) -> eval_monop op (eval e)
| BinopAp (op, e1, e2) -> eval_binop op (eval e1) (eval e2)
MonopAp (op, e) -> eval_monop (op, eval e)
| BinopAp (op, e1, e2) -> eval_binop (op, e1, 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 *)
......
......@@ -87,3 +87,6 @@ let x = Var "x" in
let y = Var "y" in
let z = Var "z" in
show_eval (app (l "x" (l "y" (l "z" (app (app x y) z)))) y);;
(* c + b *)
show_eval (Let ("a", Var "c", (BinopAp (Add, Var "a", Var "b"))));;
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