diff src/cjr_env.sml @ 188:8e9f97508f0d

Datatype representation optimization
author Adam Chlipala <adamc@hcoop.net>
date Sun, 03 Aug 2008 19:49:21 -0400
parents d11754ffe252
children 890a61991263
line wrap: on
line diff
--- a/src/cjr_env.sml	Sun Aug 03 19:01:16 2008 -0400
+++ b/src/cjr_env.sml	Sun Aug 03 19:49:21 2008 -0400
@@ -129,14 +129,21 @@
         NONE => raise UnboundStruct n
       | SOME x => x
 
+fun classifyDatatype xncs =
+    if List.all (fn (_, _, NONE) => true | _ => false) xncs then
+        Enum
+    else
+        Default
+
 fun declBinds env (d, loc) =
     case d of
-        DDatatype (x, n, xncs) =>
+        DDatatype (_, x, n, xncs) =>
         let
             val env = pushDatatype env x n xncs
+            val dt = (TDatatype (classifyDatatype xncs, n, xncs), loc)
         in
-            foldl (fn ((x', n', NONE), env) => pushENamed env x' n' (TDatatype (n, xncs), loc)
-                    | ((x', n', SOME t), env) => pushENamed env x' n' (TFun (t, (TDatatype (n, xncs), loc)), loc))
+            foldl (fn ((x', n', NONE), env) => pushENamed env x' n' dt
+                    | ((x', n', SOME t), env) => pushENamed env x' n' (TFun (t, dt), loc))
             env xncs
         end
       | DStruct (n, xts) => pushStruct env n xts