@@ -3,7 +3,7 @@ module Optimize (optimize) where
33import Ast
44import Control.Arrow (second)
55import Data.Char (isAlpha)
6−
6+import Substitute
77
88optimize (Module name ims exs stmts) =
99 Module name ims exs (map optimizeStmt stmts)
@@ -21,6 +21,9 @@ simp expr =
2121 Range e1 e2 -> Range (f e1) (f e2)
2222 Binop op e1 e2 -> simp_binop op (f e1) (f e2)
2323 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 }
2427 App e1 e2 -> App (f e1) (f e2)
2528 If e1 e2 e3 -> simp_if (f e1) (f e2) (f e3)
2629 Let defs e -> Let (map simpDef defs) (f e)
@@ -32,6 +35,15 @@ simp expr =
3235simp_if (Boolean b) e2 e3 = if b then e2 else e3
3336simp_if a b c = If a b c
3437
38+isValue e = case e of { IntNum _ -> True
39+ ; FloatNum _ -> True
40+ ; Chr _ -> True
41+ ; Str _ -> True
42+ ; Boolean _ -> True
43+ ; Var _ -> True
44+ ; Data _ _ -> True
45+ ; _ -> False }
46+
3547simp_binop = binop
3648
3749binop op (IntNum n) (IntNum m) = f n m
@@ -87,6 +99,7 @@ binop "++" e (Data "Nil" []) = e
8799binop "++" (Data "Cons" [h,t]) e = Data "Cons" [h, binop "++" t e]
88100
89101binop "$" e1 e2 = App e1 e2
102+binop "." e1 e2 = Lambda "x" (App e1 (App e2 (Var "x")))
90103
91104binop op e1 e2
92105 | isAlpha (head op) || '_' == head op = App (App (Var op) e1) e2