From 9a51377c33f484e3abb56f9d7c511716b9cb6e21 Mon Sep 17 00:00:00 2001 From: evancz Date: Thu, 19 Jul 2012 11:52:50 +0000 Subject: [PATCH] Change optimizations to match new internal representation of numbers. --- elm/src/Optimize.hs | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/elm/src/Optimize.hs b/elm/src/Optimize.hs index d285de5..9b2df45 100644 --- a/elm/src/Optimize.hs +++ b/elm/src/Optimize.hs @@ -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