#include "BUCASCS320.hats"
datatype weekday =
| Monday of ()
| Tuesday of ()
| Wednesday of ()
| Thursday of ()
| Friday of ()
fun isWednesday (day: weekday): bool =
case+ day of Wednesday () => true | _ => false
datatype order = LESS | EQUAL | GREATER
fun{a:t@ype} list0_last
(xs: list0 a): option0 a = let
fun loop (x: a, xs: list0 a): a =
case+ xs of
| list0_cons (x, xs) => loop (x, xs)
| list0_nil () => x
in
case+ xs of
| list0_cons (x, xs) => option0_some (loop (x, xs))
| list0_nil () => option0_none ()
end
datatype exp =
| EXPint of int
| EXPadd of (exp, exp)
| EXPsub of (exp, exp)
| EXPmul of (exp, exp)
| EXPdiv of (exp, exp)
fun exp_eval (e: exp): int = case+ e of
| EXPint i => i
| EXPadd (e1, e2) => exp_eval e1 + exp_eval e2
| EXPsub (e1, e2) => exp_eval e1 - exp_eval e2
| EXPmul (e1, e2) => exp_eval e1 * exp_eval e2
| EXPdiv (e1, e2) => exp_eval e1 / exp_eval e2
fun fprint_exp (out: FILEref, e: exp): void = let
macdef prexp (e) = fprint_exp (out, ,(e))
macdef prstr (s) = fprint_string (out, ,(s))
in
case+ e of
| EXPint i => fprint_int (out, i)
| EXPadd (e1, e2) => begin
prstr "EXPadd("; prexp e1; prstr ", "; prexp e2; prstr ")"
end
| EXPsub (e1, e2) => begin
prstr "EXPsub("; prexp e1; prstr ", "; prexp e2; prstr ")"
end
| EXPmul (e1, e2) => begin
prstr "EXPmul("; prexp e1; prstr ", "; prexp e2; prstr ")"
end
| EXPdiv (e1, e2) => begin
prstr "EXPdiv("; prexp e1; prstr ", "; prexp e2; prstr ")"
end
end
fun print_exp (e: exp): void = fprint_exp (stdout_ref, e)
fun prerr_exp (e: exp): void = fprint_exp (stderr_ref, e)
overload print with print_exp
overload prerr with prerr_exp
implement main () = let
val e1 = EXPmul (e2, EXPint 7) where {
val e2 = EXPsub (EXPint 5, EXPdiv (EXPint 11, EXPint 7))
}
val ans1 = exp_eval (e1)
in
print "e1 = "; print (e1); print_newline ();
print "ans1 = "; print (ans1); print_newline ()
end