changeset 1533:75d77fbe7c94

Distribute applications of "arrow type" ECase across branches.
author Karn Kallio <kkallio@eka>
date Fri, 12 Aug 2011 00:55:57 -0430
parents 7ef09e91198b
children 89d7b1c3199a
files src/reduce.sml
diffstat 1 files changed, 39 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/reduce.sml	Wed Aug 10 18:39:27 2011 -0400
+++ b/src/reduce.sml	Fri Aug 12 00:55:57 2011 -0430
@@ -371,6 +371,15 @@
                          else
                              ()*)
 
+                fun patBinds (p, _) =
+                    case p of
+                        PWild => 0
+                      | PVar _ => 1
+                      | PPrim _ => 0
+                      | PCon (_, _, _, NONE) => 0
+                      | PCon (_, _, _, SOME p) => patBinds p
+                      | PRecord xpts => foldl (fn ((_, p, _), n) => n + patBinds p) 0 xpts
+
                 val r = case e of
                             EPrim _ => all
                           | ERel n =>
@@ -458,6 +467,20 @@
                                                                ("r", CorePrint.p_exp CoreEnv.empty r)];*)
                                         r
                                     end
+                                  | ECase (e, pes, cc as {disc, result = res as (TFun (_, c2), _)}) =>
+                                    let
+                                        val pes' = map (fn (p, body) =>
+                                                           let
+                                                               val env' = List.tabulate (patBinds p, fn _ => UnknownE) @ (deKnown env)
+                                                               val body' = exp env' (EApp (body, multiLiftExpInExp (patBinds p) e2), #2 body)
+                                                           in
+                                                               (p, body')
+                                                           end) pes
+
+                                        val cc' = {disc = disc, result = c2}
+                                    in
+                                        (ECase (e, pes', cc'), loc)
+                                    end
                                   | _ => (EApp (e1, e2), loc)
                             end
 
@@ -480,6 +503,22 @@
                                                                ("r", CorePrint.p_exp CoreEnv.empty r)];*)
                                         r
                                     end
+                                  | ECase (e, pes, cc as {disc, result = res as (TCFun (_, _, c'), _)}) =>
+                                    let
+                                        val pes' = map (fn (p, body) =>
+                                                        let
+                                                            val env' = List.tabulate (patBinds p, fn _ => UnknownE) @ (deKnown env)
+
+                                                            val body' = exp env' (ECApp (body, c), #2 body)
+                                                        in
+                                                            (p, body')
+                                                        end) pes
+
+                                        val c' = E.subConInCon (0, c) c'
+                                        val cc' = {disc = disc, result = c'}
+                                    in
+                                        (ECase (e, pes', cc'), loc)
+                                    end
                                   | _ => (ECApp (e, c), loc)
                             end
 
@@ -611,15 +650,6 @@
 
                           | ECase (e, pes, {disc, result}) =>
                             let
-                                fun patBinds (p, _) =
-                                    case p of
-                                        PWild => 0
-                                      | PVar _ => 1
-                                      | PPrim _ => 0
-                                      | PCon (_, _, _, NONE) => 0
-                                      | PCon (_, _, _, SOME p) => patBinds p
-                                      | PRecord xpts => foldl (fn ((_, p, _), n) => n + patBinds p) 0 xpts
-
                                 fun pat (all as (p, loc)) =
                                     case p of
                                         PWild => all