[rename variables with local names when printing E
John Meacham <john@repetae.net>**20060203132431] hunk ./E/Show.hs 5
+import qualified Data.Set as Set
hunk ./E/Show.hs 13
+import E.FreeVars()
+import Support.FreeVars
hunk ./E/Show.hs 44
-newtype SEM a = SEM (Identity a)
+newtype SEM a = SEM { unSEM :: VarNameT E Id String Identity a }
hunk ./E/Show.hs 82
+showI i = do
+    n <- SEM $ maybeLookupName i
+    case n of
+        Nothing -> showId i
+        Just n -> text n
+
hunk ./E/Show.hs 93
-    return $ atom (si (showId i)) `inhabit` ty
-showTVr' TVr { tvrIdent = i} = return $ atom $ showId i
+    ii <- showI i
+    return $ atom (si ii) `inhabit` ty
+showTVr' TVr { tvrIdent = i} = do
+    ii <- showI i
+    return $ atom ii
hunk ./E/Show.hs 100
+allocTVr :: TVr -> SEM a -> SEM a
+allocTVr tvr action | tvrIdent tvr == 0 = action
+allocTVr tvr action | tvrType tvr == eStar  = do
+    SEM $ newName (map (:[]) ['a' ..]) eStar (tvrIdent tvr)
+    action
+allocTVr tvr action | tvrType tvr == eStar `tFunc` eStar  = do
+    SEM $ newName (map (('f':) . show) [0::Int ..])  (tvrType tvr) (tvrIdent tvr)
+    action
+allocTVr tvr action | even (tvrIdent tvr) = do
+    SEM $ newName (map (('v':) . show) [1::Int ..]) Unknown (tvrIdent tvr)
+    action
+allocTVr _ action = action
hunk ./E/Show.hs 122
-        f (ELam tvr@TVr {tvrType =  z} e) | z == eStar =  do
-            tvr <- showTVr tvr
-            liftM2 dot (return $ pop (retOp UC.lAmbda) tvr) (showE e)
hunk ./E/Show.hs 123
-        f (EPi tvr@(TVr {  tvrType =  z}) e) | z == eStar = do
+        f (EPi (TVr { tvrIdent = n, tvrType =  e1}) e2) | not $ n `Set.member` freeVars e2 = liftM2 arr (showE e1) (showE e2)
+        f (EPi tvr@(TVr {  tvrType =  z}) e) | z == eStar = allocTVr tvr $ do
hunk ./E/Show.hs 127
-        f (EPi t e) = do
+        f (EPi t e) = allocTVr t $ do
hunk ./E/Show.hs 131
-        f (ELam t e) = do
+        f (ELam tvr@TVr {tvrType =  z} e) | z == eStar = allocTVr tvr $ do
+            tvr <- showTVr' tvr
+            liftM2 dot (return $ pop (retOp UC.lAmbda) tvr) (showE e)
+        f (ELam t e) = allocTVr t $ do
hunk ./E/Show.hs 138
-        f (EVar TVr { tvrIdent = i }) = return $ atom $ showId i
+        f (EVar tvr) = showTVr' tvr
hunk ./E/Show.hs 156
-        f ec@(ECase { eCaseScrutinee = e, eCaseAlts = alts }) = do
+        f ec@(ECase { eCaseScrutinee = e, eCaseAlts = alts }) = allocTVr (eCaseBind ec) $ do
hunk ./E/Show.hs 162
-                    db <- showTVr (eCaseBind ec)
+                    let ecb = eCaseBind ec
+
+                    db <- showTVr (if tvrIdent ecb `Set.member` freeVars e then ecb else ecb { tvrIdent = 0 })
hunk ./E/Show.hs 170
-        showAlt (Alt l e) = do
-            l <- showLit showTVr l
-            e <- showE e
-            return $ nest 4 $ fill 10 ((unparse l) <+>  UC.rArrow </> (unparse e))
+        showAlt (Alt l e) = foldr allocTVr ans (litBinds l) where
+            ans = do
+                l <- showLit showTVr l
+                e <- showE e
+                return $ nest 4 $ fill 10 ((unparse l) <+>  UC.rArrow </> (unparse e))
hunk ./E/Show.hs 176
-            t <- showTVr t
-            e <- showE e
+            t <- subSEM $ showTVr t
+            e <- subSEM $ showE e
hunk ./E/Show.hs 188
+subSEM (SEM act) = SEM $ subVarName act
+
hunk ./E/Show.hs 197
-    (SEM (Identity pe)) = showE e
+    (SEM pe') = showE e
+    Identity pe = runVarNameT pe'
hunk ./Util/VarName.hs 7
+    subVarName,
hunk ./Util/VarName.hs 28
+subVarName ::  Monad m => VarNameT nc ni no m a -> VarNameT nc ni no m a
+subVarName (VarName action) = VarName $ do
+    x <- get
+    r <- action
+    put x
+    return r
+