diff src/cjrize.sml @ 121:91027db5a07c

Multiple arguments to web functions
author Adam Chlipala <adamc@hcoop.net>
date Sun, 13 Jul 2008 20:24:05 -0400
parents 6230bdd122e7
children 76a4d69719d8
line wrap: on
line diff
--- a/src/cjrize.sml	Sun Jul 13 20:07:10 2008 -0400
+++ b/src/cjrize.sml	Sun Jul 13 20:24:05 2008 -0400
@@ -165,16 +165,27 @@
             val (t, sm) = cifyTyp (t, sm)
 
             val (d, sm) = case #1 t of
-                              L'.TFun (dom, ran) =>
-                              (case #1 e of
-                                   L.EAbs (ax, _, _, e) =>
-                                   let
-                                       val (e, sm) = cifyExp (e, sm)
-                                   in
-                                       (L'.DFun (x, n, ax, dom, ran, e), sm)
-                                   end
-                                 | _ => (ErrorMsg.errorAt loc "Function isn't explicit at code generation";
-                                         (L'.DVal ("", 0, t, (L'.EPrim (Prim.Int 0), ErrorMsg.dummySpan)), sm)))
+                              L'.TFun _ =>
+                              let
+                                  fun unravel (tAll as (t, _), eAll as (e, _)) =
+                                      case (t, e) of
+                                          (L'.TFun (dom, ran), L.EAbs (ax, _, _, e)) =>
+                                          let
+                                              val (args, t, e) = unravel (ran, e)
+                                          in
+                                              ((ax, dom) :: args, t, e)
+                                          end
+                                        | (L'.TFun _, _) =>
+                                          (ErrorMsg.errorAt loc "Function isn't explicit at code generation";
+                                           ([], tAll, eAll))
+                                        | _ => ([], tAll, eAll)
+
+                                  val (args, ran, e) = unravel (t, e)
+                                  val (e, sm) = cifyExp (e, sm)
+                              in
+                                  (L'.DFun (x, n, args, ran, e), sm)
+                              end
+
                             | _ =>
                               let
                                   val (e, sm) = cifyExp (e, sm)