changeset 814:3f3b211f9bca

Fix argument ordering bug in fuse; fix case subsitution bug in MonoReduce
author Adam Chlipala <adamc@hcoop.net>
date Sun, 17 May 2009 14:36:55 -0400
parents 7b380e2b9e68
children 493f44759879
files src/fuse.sml src/mono_reduce.sml
diffstat 2 files changed, 7 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/fuse.sml	Sun May 17 13:25:57 2009 -0400
+++ b/src/fuse.sml	Sun May 17 14:36:55 2009 -0400
@@ -78,7 +78,7 @@
 
                                                   val (body, args) = getBody (e, args)
                                                   val body = MonoOpt.optExp (EWrite body, loc)
-                                                  val (body, _) = foldl (fn ((x, dom), (body, ran)) =>
+                                                  val (body, _) = foldr (fn ((x, dom), (body, ran)) =>
                                                                             ((EAbs (x, dom, ran, body), loc),
                                                                              (TFun (dom, ran), loc)))
                                                                         (body, (TRecord [], loc)) args
--- a/src/mono_reduce.sml	Sun May 17 13:25:57 2009 -0400
+++ b/src/mono_reduce.sml	Sun May 17 14:36:55 2009 -0400
@@ -140,12 +140,12 @@
                 bind = fn ((lower, len), U.Exp.RelE _) => (lower+1, len)
                         | (st, _) => st}
 
-datatype result = Yes of E.env | No | Maybe
+datatype result = Yes of exp list | No | Maybe
 
 fun match (env, p : pat, e : exp) =
     case (#1 p, #1 e) of
         (PWild, _) => Yes env
-      | (PVar (x, t), _) => Yes (E.pushERel env x t (SOME e))
+      | (PVar (x, t), _) => Yes (e :: env)
 
       | (PPrim (Prim.String s), EStrcat ((EPrim (Prim.String s'), _), _)) =>
         if String.isPrefix s' s then
@@ -406,12 +406,13 @@
                                 case pes of
                                     [] => push ()
                                   | (p, body) :: pes =>
-                                    case match (env, p, e') of
+                                    case match ([], p, e') of
                                         No => search pes
                                       | Maybe => push ()
-                                      | Yes env' =>
+                                      | Yes subs =>
                                         let
-                                            val r = reduceExp env' body
+                                            val body = foldr (fn (e, body) => subExpInExp (0, e) body) body subs
+                                            val r = reduceExp env body
                                         in
                                             (*Print.prefaces "ECase"
                                                            [("body", MonoPrint.p_exp env' body),