@@ -24,39 +24,40 @@ simp expr =
24simp_if (Boolean b) e2 e3 = if b then e2 else e3
24simp_if (Boolean b) e2 e3 = if b then e2 else e3
25simp_if a b c = If a b c
25simp_if a b c = If a b c
27−simp_binop "mod" (Number n) (Number m) = Number (mod n m)
27+simp_binop "mod" (IntNum n) (IntNum m) = IntNum (mod n m)
28simp_binop "mod" e1 e2 = Binop "mod" e1 e2
28simp_binop "mod" e1 e2 = Binop "mod" e1 e2
29simp_binop str e1 e2
29simp_binop str e1 e2
30 | isAlpha (head str) || '_' == head str = App (App (Var str) e1) e2
30 | isAlpha (head str) || '_' == head str = App (App (Var str) e1) e2
31 | otherwise = binop str e1 e2
31 | otherwise = binop str e1 e2
33−binop op (Number n) (Number m) = f n m
33+binop op (IntNum n) (IntNum m) = f n m
34 where f a b = case op of
34 where f a b = case op of
35− { "+" -> Number $ (+) a b
35+ { "+" -> IntNum $ (+) a b
36− ; "-" -> Number $ (-) a b
36+ ; "-" -> IntNum $ (-) a b
37− ; "*" -> Number $ (*) a b
37+ ; "*" -> IntNum $ (*) a b
38− --; "/" -> Number $ div a b
38+ ; "div" -> IntNum $ div a b
39 ; "<" -> Boolean $ a < b
39 ; "<" -> Boolean $ a < b
40 ; ">" -> Boolean $ a < b
40 ; ">" -> Boolean $ a < b
41 ; "<=" -> Boolean $ a <= b
41 ; "<=" -> Boolean $ a <= b
42 ; ">=" -> Boolean $ a >= b
42 ; ">=" -> Boolean $ a >= b
43 ; "==" -> Boolean $ a == b
43 ; "==" -> Boolean $ a == b
44 ; "/=" -> Boolean $ a /= b
44 ; "/=" -> Boolean $ a /= b
45− ; _ -> Binop op (Number n) (Number m) }
45+ ; _ -> Binop op (IntNum n) (IntNum m) }
47−binop "-" e (Number 0) = e
47+binop "-" e (IntNum 0) = e
48−binop "+" (Number 0) e = e
48+binop "+" (IntNum 0) e = e
49−binop "+" (Number n) (Binop "+" (Number m) e) = binop "+" (Number (n+m)) e
49+binop "+" (IntNum n) (Binop "+" (IntNum m) e) = binop "+" (IntNum (n+m)) e
50−binop "+" (Number n) (Binop "+" e (Number m)) = binop "+" (Number (n+m)) e
50+binop "+" (IntNum n) (Binop "+" e (IntNum m)) = binop "+" (IntNum (n+m)) e
52−binop "/" e (Number 1) = e
52+binop "/" e (IntNum 1) = e
53−binop "*" (Number 0) e = Number 0
53+binop "div" e (IntNum 1) = e
54+binop "*" (IntNum 0) e = IntNum 0
54−binop "*" (Number 1) e = e
55+binop "*" (IntNum 1) e = e
55−binop "*" (Number n) (Binop "*" (Number m) e) = binop "*" (Number (n*m)) e
56+binop "*" (IntNum n) (Binop "*" (IntNum m) e) = binop "*" (IntNum (n*m)) e
56−binop "*" (Number n) (Binop "*" e (Number m)) = binop "*" (Number (n*m)) e
57+binop "*" (IntNum n) (Binop "*" e (IntNum m)) = binop "*" (IntNum (n*m)) e
58−binop "+" e (Number n) = binop "+" (Number n) e
59+binop "+" e (IntNum n) = binop "+" (IntNum n) e
59−binop "*" e (Number n) = binop "*" (Number n) e
60+binop "*" e (IntNum n) = binop "*" (IntNum n) e
61binop op (Boolean n) (Boolean m) = f n m
62binop op (Boolean n) (Boolean m) = f n m
62 where f a b = case op of { "&&" -> Boolean $ (&&) n m
63 where f a b = case op of { "&&" -> Boolean $ (&&) n m