Commit feedb9d1 authored by Taddeus Kroes's avatar Taddeus Kroes

funclang series4: Improved assigmment 10.

parent 1f71a51d
type arithOp = type arithOp = Plus | Minus | Times | Divide | Modulo
Plus of int * int type relOp = Eq | Neq | Lt | Lte | Gt | Gte
| Minus of int * int type logicOp = And | Or
| Times of int * int type binOp = ArithOp of arithOp | RelOp of relOp | LogicOp of logicOp
| Divide of int * int type monOp = UnaryMinus | Negation
| Modulo of int * int type const = BoolConst of bool | IntConst of int
type relOp =
EQ of int * int
| NEQ of int * int
| LT of int * int
| LTE of int * int
| GT of int * int
| GTE of int * int
type logicOp =
AND of bool * bool
| OR of bool * bool
type binOp =
ArithOp of arithOp
| RelOp of relOp
| LogicOp of logicOp
type monOp =
UnaryMinus of int
| Negation of bool
type const =
BoolConst of bool
| IntConst of int
type expr = type expr =
Enclosure of expr Enclosure of expr
| BinOp of expr * binOp * expr | BinOp of expr * binOp * expr
...@@ -40,27 +14,23 @@ type expr = ...@@ -40,27 +14,23 @@ type expr =
let rec eval_expr = let rec eval_expr =
let eval_binOp = let eval_binOp =
let eval_arithOp = function let eval_arithOp = function
Plus (a, b) -> "(" ^ (string_of_int a) ^ " + " ^ (string_of_int b) Plus -> "+"
| Minus (a, b) -> "(" ^ (string_of_int a) ^ " - " | Minus -> "-"
^ (string_of_int b) ^ ")" | Times -> "*"
| Times (a, b) -> "(" ^ (string_of_int a) ^ " * " | Divide -> "/"
^ (string_of_int b) ^ ")" | Modulo -> "mod"
| Divide (a, b) -> "(" ^ (string_of_int a) ^ " / "
^ (string_of_int b) ^ ")"
| Modulo (a, b) -> "(" ^ (string_of_int a) ^ " mod "
^ (string_of_int b) ^ ")"
in in
let eval_relOp = function let eval_relOp = function
EQ (a, b) -> (string_of_int a) ^ " = " ^ (string_of_int b) Eq -> "="
| NEQ (a, b) -> (string_of_int a) ^ " != " ^ (string_of_int b) | Neq -> "!="
| LT (a, b) -> (string_of_int a) ^ " < " ^ (string_of_int b) | Lt -> "<"
| LTE (a, b) -> (string_of_int a) ^ " <= " ^ (string_of_int b) | Lte -> "<="
| GT (a, b) -> (string_of_int a) ^ " > " ^ (string_of_int b) | Gt -> ">"
| GTE (a, b) -> (string_of_int a) ^ " >= " ^ (string_of_int b) | Gte -> ">="
in in
let eval_logicOp = function let eval_logicOp = function
AND (a, b) -> (string_of_bool a) ^ " && " ^ (string_of_bool b) And -> "&&"
| OR (a, b) -> (string_of_bool a) ^ " || " ^ (string_of_bool b) | Or -> "||"
in in
function function
ArithOp op -> eval_arithOp(op) ArithOp op -> eval_arithOp(op)
...@@ -68,8 +38,8 @@ let rec eval_expr = ...@@ -68,8 +38,8 @@ let rec eval_expr =
| LogicOp op -> eval_logicOp(op) | LogicOp op -> eval_logicOp(op)
in in
let eval_monOp = function let eval_monOp = function
UnaryMinus i -> "-" ^ string_of_int i UnaryMinus -> "-"
| Negation b -> "!" ^ string_of_bool b | Negation -> "!"
in in
let eval_const = function let eval_const = function
IntConst i -> string_of_int i IntConst i -> string_of_int i
...@@ -77,7 +47,25 @@ let rec eval_expr = ...@@ -77,7 +47,25 @@ let rec eval_expr =
in in
function function
Enclosure e -> "(" ^ eval_expr(e) ^ ")" Enclosure e -> "(" ^ eval_expr(e) ^ ")"
| BinOp (e1, op, e2) -> eval_expr(e1) ^ eval_binOp(op) ^ eval_expr(e2) | BinOp (e1, op, e2) -> eval_expr(e1) ^ " " ^ eval_binOp(op)
^ " " ^ eval_expr(e2)
| MonOp (op, e) -> eval_monOp(op) ^ eval_expr(e) | MonOp (op, e) -> eval_monOp(op) ^ eval_expr(e)
| Id id -> id | Id id -> id
| Const c -> eval_const(c) | Const c -> eval_const(c)
;;
(* (a) *)
print_endline (eval_expr (Enclosure (Id "a")));;
(* -a *)
print_endline (eval_expr (MonOp (UnaryMinus, Id "a")));;
(* a - b *)
print_endline (eval_expr (BinOp (Id "a", ArithOp Minus, Id "b")));;
(* a * (-b + 1) *)
let a_times b = BinOp (Id "a", ArithOp Times, b) in
let uminus a = MonOp (UnaryMinus, a) in
let plus a b = BinOp (a, ArithOp Plus, b) in
let one = Const (IntConst 1) in
print_endline (eval_expr (a_times (Enclosure (plus (uminus (Id "b")) one))));;
(* a = b && c *)
let b_and_c = BinOp (Id "b", LogicOp And, Id "c") in
print_endline (eval_expr (BinOp (Id "a", RelOp Eq, b_and_c)));;
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