Change optimizations to match new internal representation of numbers.
This commit is contained in:
parent
153d05438c
commit
9a51377c33
1 changed files with 19 additions and 18 deletions
|
@ -24,39 +24,40 @@ simp expr =
|
|||
simp_if (Boolean b) e2 e3 = if b then e2 else e3
|
||||
simp_if a b c = If a b c
|
||||
|
||||
simp_binop "mod" (Number n) (Number m) = Number (mod n m)
|
||||
simp_binop "mod" (IntNum n) (IntNum m) = IntNum (mod n m)
|
||||
simp_binop "mod" e1 e2 = Binop "mod" e1 e2
|
||||
simp_binop str e1 e2
|
||||
| isAlpha (head str) || '_' == head str = App (App (Var str) e1) e2
|
||||
| otherwise = binop str e1 e2
|
||||
|
||||
binop op (Number n) (Number m) = f n m
|
||||
binop op (IntNum n) (IntNum m) = f n m
|
||||
where f a b = case op of
|
||||
{ "+" -> Number $ (+) a b
|
||||
; "-" -> Number $ (-) a b
|
||||
; "*" -> Number $ (*) a b
|
||||
--; "/" -> Number $ div a b
|
||||
{ "+" -> IntNum $ (+) a b
|
||||
; "-" -> IntNum $ (-) a b
|
||||
; "*" -> IntNum $ (*) a b
|
||||
; "div" -> IntNum $ div a b
|
||||
; "<" -> Boolean $ a < b
|
||||
; ">" -> Boolean $ a < b
|
||||
; "<=" -> Boolean $ a <= b
|
||||
; ">=" -> Boolean $ a >= b
|
||||
; "==" -> Boolean $ a == b
|
||||
; "/=" -> Boolean $ a /= b
|
||||
; _ -> Binop op (Number n) (Number m) }
|
||||
; _ -> Binop op (IntNum n) (IntNum m) }
|
||||
|
||||
binop "-" e (Number 0) = e
|
||||
binop "+" (Number 0) e = e
|
||||
binop "+" (Number n) (Binop "+" (Number m) e) = binop "+" (Number (n+m)) e
|
||||
binop "+" (Number n) (Binop "+" e (Number m)) = binop "+" (Number (n+m)) e
|
||||
binop "-" e (IntNum 0) = e
|
||||
binop "+" (IntNum 0) e = e
|
||||
binop "+" (IntNum n) (Binop "+" (IntNum m) e) = binop "+" (IntNum (n+m)) e
|
||||
binop "+" (IntNum n) (Binop "+" e (IntNum m)) = binop "+" (IntNum (n+m)) e
|
||||
|
||||
binop "/" e (Number 1) = e
|
||||
binop "*" (Number 0) e = Number 0
|
||||
binop "*" (Number 1) e = e
|
||||
binop "*" (Number n) (Binop "*" (Number m) e) = binop "*" (Number (n*m)) e
|
||||
binop "*" (Number n) (Binop "*" e (Number m)) = binop "*" (Number (n*m)) e
|
||||
binop "/" e (IntNum 1) = e
|
||||
binop "div" e (IntNum 1) = e
|
||||
binop "*" (IntNum 0) e = IntNum 0
|
||||
binop "*" (IntNum 1) e = e
|
||||
binop "*" (IntNum n) (Binop "*" (IntNum m) e) = binop "*" (IntNum (n*m)) e
|
||||
binop "*" (IntNum n) (Binop "*" e (IntNum m)) = binop "*" (IntNum (n*m)) e
|
||||
|
||||
binop "+" e (Number n) = binop "+" (Number n) e
|
||||
binop "*" e (Number n) = binop "*" (Number n) e
|
||||
binop "+" e (IntNum n) = binop "+" (IntNum n) e
|
||||
binop "*" e (IntNum n) = binop "*" (IntNum n) e
|
||||
|
||||
binop op (Boolean n) (Boolean m) = f n m
|
||||
where f a b = case op of { "&&" -> Boolean $ (&&) n m
|
||||
|
|
Loading…
Reference in a new issue