@@ -3,7 +3,7 @@ module Optimize (optimize) where
4import Control.Arrow (second)
4import Control.Arrow (second)
5import Data.Char (isAlpha)
5import Data.Char (isAlpha)
8optimize (Module name ims exs stmts) =
8optimize (Module name ims exs stmts) =
9 Module name ims exs (map optimizeStmt stmts)
9 Module name ims exs (map optimizeStmt stmts)
@@ -21,6 +21,9 @@ simp expr =
21 Range e1 e2 -> Range (f e1) (f e2)
21 Range e1 e2 -> Range (f e1) (f e2)
22 Binop op e1 e2 -> simp_binop op (f e1) (f e2)
22 Binop op e1 e2 -> simp_binop op (f e1) (f e2)
23 Lambda x e -> Lambda x (f e)
23 Lambda x e -> Lambda x (f e)
24+ App (Lambda x e1) e2 ->
25+ if isValue e2' then subst x e2' e1' else App (Lambda x e1') e2'
26+ where { e1' = f e1 ; e2' = f e2 }
24 App e1 e2 -> App (f e1) (f e2)
27 App e1 e2 -> App (f e1) (f e2)
25 If e1 e2 e3 -> simp_if (f e1) (f e2) (f e3)
28 If e1 e2 e3 -> simp_if (f e1) (f e2) (f e3)
26 Let defs e -> Let (map simpDef defs) (f e)
29 Let defs e -> Let (map simpDef defs) (f e)
@@ -32,6 +35,15 @@ simp expr =
32simp_if (Boolean b) e2 e3 = if b then e2 else e3
35simp_if (Boolean b) e2 e3 = if b then e2 else e3
33simp_if a b c = If a b c
36simp_if a b c = If a b c
38+isValue e = case e of { IntNum _ -> True
35simp_binop = binop
47simp_binop = binop
37binop op (IntNum n) (IntNum m) = f n m
49binop op (IntNum n) (IntNum m) = f n m
@@ -87,6 +99,7 @@ binop "++" e (Data "Nil" []) = e
87binop "++" (Data "Cons" [h,t]) e = Data "Cons" [h, binop "++" t e]
99binop "++" (Data "Cons" [h,t]) e = Data "Cons" [h, binop "++" t e]
89binop "$" e1 e2 = App e1 e2
101binop "$" e1 e2 = App e1 e2
102+binop "." e1 e2 = Lambda "x" (App e1 (App e2 (Var "x")))
91binop op e1 e2
104binop op e1 e2
92 | isAlpha (head op) || '_' == head op = App (App (Var op) e1) e2
105 | isAlpha (head op) || '_' == head op = App (App (Var op) e1) e2