[get rid of last references to 'localVars' hack in favor of monadic fresh names
John Meacham <john@repetae.net>**20060301032723] hunk ./E/FromHs.hs 69
-localVars = [10,12..]
hunk ./E/FromHs.hs 360
-    cDecl (HsForeignDecl _ i@(Import {}) HS.Primitive _ n _) = result where
-        result    = expr $ foldr ($) (EPrim (toPrim i) (map EVar es) rt) (map ELam es)
-        expr x    = return [(name,var,lamt x)]
-        name      = toName Name.Val n
-        var       = tVr (nameToInt name) ty
-        (ty,lamt) = pval name
-        (ts,rt)   = argTypes' ty
-        es        = [ (tVr ( n) t) |  t <- ts, not (sortStarLike t) | n <- localVars ]
-        toPrim (Import cn is ls) = APrim (PrimPrim cn) (Requires is ls)
-    cDecl (HsForeignDecl _ i@HS.AddrOf {} _ _ n _) = result where
-        (cn,st,ct) = runIdentity (lookupCType' dataTable rt)
-        (ty,lamt)  = pval name
-        (ts,rt)    = argTypes' ty
-        name       = toName Name.Val n
-        newId      = head $ freeNames $ freeVars rt
-        uvar       = tVr newId st
-        var        = tVr (nameToInt name) ty
-        expr x     = return [(name,var,lamt x)]
-        prim       = APrim (CP.AddrOf cn) (Requires is ls) where HS.AddrOf cn is ls = i
-        result     = expr $ eStrictLet uvar (EPrim prim [] st) (ELit (LitCons cn [EVar uvar] rt))
+    cDecl (HsForeignDecl _ i@(Import {}) HS.Primitive _ n _) = do
+        let name      = toName Name.Val n
+            var       = tVr (nameToInt name) ty
+            (ty,lamt) = pval name
+            (ts,rt)   = argTypes' ty
+            toPrim (Import cn is ls) = APrim (PrimPrim cn) (Requires is ls)
+        es <- newVars [ t |  t <- ts, not (sortStarLike t) ]
+        let result    = foldr ($) (EPrim (toPrim i) (map EVar es) rt) (map ELam es)
+        return [(name,var,lamt result)]
+    cDecl (HsForeignDecl _ i@HS.AddrOf {} _ _ n _) = do
+        let (ty,lamt)  = pval name
+            (ts,rt)    = argTypes' ty
+            name       = toName Name.Val n
+        (cn,st,ct) <- lookupCType' dataTable rt
+        [uvar] <- newVars [st]
+        let var        = tVr (nameToInt name) ty
+            expr x     = return [(name,var,lamt x)]
+            prim       = APrim (CP.AddrOf cn) (Requires is ls) where HS.AddrOf cn is ls = i
+        expr $ eStrictLet uvar (EPrim prim [] st) (ELit (LitCons cn [EVar uvar] rt))
hunk ./E/FromHs.hs 433
-            bs' = [(tVr (n) t) | n <- localVars | t <- take numberPatterns eargs]
-            bs  = map EVar bs'
-            rt = discardArgs (length targs + numberPatterns) t
hunk ./E/FromHs.hs 434
-            z e = foldr (eLam) e bs'
+        bs' <- newVars (take numberPatterns eargs)
+        let bs  = map EVar bs'
+            rt = discardArgs (length targs + numberPatterns) t
+            z e = foldr eLam e bs'