[perform specialization of SPECIALIZE pragmas that have free variables properly
John Meacham <john@repetae.net>**20090305011315
 Ignore-this: 6fa3ec217eae34cb2572075f0ad2aca0
] hunk ./E/FromHs.hs 14
-import List(isPrefixOf)
+import List(isPrefixOf,nub)
hunk ./E/FromHs.hs 84
+eArrow t1 t2  =  EPi (tVr emptyId t1) t2
hunk ./E/FromHs.hs 1015
-procAllSpecs :: Monad m => [Type.Rule] -> [(TVr,E)] -> m ([(TVr,E)],Rules)
-procAllSpecs rs ds = do
+procAllSpecs :: Monad m => DataTable -> [Type.Rule] -> [(TVr,E)] -> m ([(TVr,E)],Rules)
+procAllSpecs dataTable rs ds = do
hunk ./E/FromHs.hs 1019
-            hs <- mapM (makeSpec (t,e)) rs
+            hs <- mapM (makeSpec dataTable (t,e)) rs
hunk ./E/FromHs.hs 1026
-makeSpec :: Monad m => (TVr,E) -> T.Rule -> m ((TVr,E),Rule)
-makeSpec (t,e) T.RuleSpec { T.ruleType = rt, T.ruleUniq = (Module m,ui), T.ruleSuper = ss } = do
-    let nt = tipe rt
+makeSpec :: Monad m => DataTable -> (TVr,E) -> T.Rule -> m ((TVr,E),Rule)
+makeSpec dataTable (t,e) T.RuleSpec { T.ruleType = rt, T.ruleUniq = (Module m,ui), T.ruleSuper = ss } = do
+    let nt = removeNewtypes dataTable $ tipe rt
hunk ./E/FromHs.hs 1030
-    let ntvr = tvr { tvrIdent = toId newName, tvrType = nt, tvrInfo = setProperties (prop_SPECIALIZATION:sspec) mempty }
+    let ntvr = tvr { tvrIdent = toId newName, tvrType = getType nbody, tvrInfo = setProperties (prop_SPECIALIZATION:sspec) mempty }
hunk ./E/FromHs.hs 1035
-        ar = makeRule ("Specialize.{" ++ show newName) (Module m,ui) RuleSpecialization [] t as (EVar ntvr)
-    return ((ntvr,foldl EAp e as),ar)
-makeSpec _ _ = fail "E.FromHs.makeSpec: invalid specialization"
+        ar = makeRule ("Specialize.{" ++ show newName) (Module m,ui) RuleSpecialization bvars t as (foldl eAp (EVar ntvr) (map EVar bvars)) 
+        bvars = nub $ freeVars as
+        nbody = foldr ELam (foldl EAp e as) bvars
+    return ((ntvr,nbody),ar)
+makeSpec _ _ _ = fail "E.FromHs.makeSpec: invalid specialization"
hunk ./Main.hs 245
-    (nds,specializeRules) <- procAllSpecs (tiCheckedRules tiData) ds
+    (nds,specializeRules) <- procAllSpecs fullDataTable (tiCheckedRules tiData) ds