Repository : ssh://darcs.haskell.org//srv/darcs/ghc

On branch  : 

http://hackage.haskell.org/trac/ghc/changeset/e53710f68de8e9397f6beb8eedc60e9b35c4ed97

>---------------------------------------------------------------

commit e53710f68de8e9397f6beb8eedc60e9b35c4ed97
Author: Max Bolingbroke <batterseapo...@hotmail.com>
Date:   Thu Dec 8 13:53:56 2011 +0000

    Better pretty-printing for lambdas (more horizontally compact)

>---------------------------------------------------------------

 .../supercompile/Supercompile/Core/FreeVars.hs     |    3 +
 compiler/supercompile/Supercompile/Core/Syntax.hs  |   84 ++++++++++++++------
 2 files changed, 61 insertions(+), 26 deletions(-)

diff --git a/compiler/supercompile/Supercompile/Core/FreeVars.hs 
b/compiler/supercompile/Supercompile/Core/FreeVars.hs
index 0dc2090..f3813b5 100644
--- a/compiler/supercompile/Supercompile/Core/FreeVars.hs
+++ b/compiler/supercompile/Supercompile/Core/FreeVars.hs
@@ -118,6 +118,9 @@ instance Ord1 FVed where
 instance Outputable1 FVed where
     pprPrec1 prec (FVed _ x) = pprPrec prec x
 
+instance OutputableLambdas1 FVed where
+    pprPrecLam1 (FVed _ x) = pprPrecLam x
+
 instance Show a => Show (FVed a) where
     showsPrec = showsPrec1
 
diff --git a/compiler/supercompile/Supercompile/Core/Syntax.hs 
b/compiler/supercompile/Supercompile/Core/Syntax.hs
index 48ea955..6741323 100644
--- a/compiler/supercompile/Supercompile/Core/Syntax.hs
+++ b/compiler/supercompile/Supercompile/Core/Syntax.hs
@@ -38,6 +38,32 @@ decomposeCo :: Int -> NormalCo -> [NormalCo]
 decomposeCo arity co = [mkNthCo n co | n <- [0..(arity-1)] ]
 
 
+class Outputable a => OutputableLambdas a where
+    pprPrecLam :: a -> ([Var], Rational -> SDoc)
+
+class Outputable1 f => OutputableLambdas1 f where
+    pprPrecLam1 :: OutputableLambdas a => f a -> ([Var], Rational -> SDoc)
+
+instance (OutputableLambdas1 f, OutputableLambdas a) => OutputableLambdas 
(Wrapper1 f a) where
+    pprPrecLam = pprPrecLam1 . unWrapper1
+
+instance OutputableLambdas1 Identity where
+    pprPrecLam1 (I x) = pprPrecLam x
+
+instance (Functor f, OutputableLambdas1 f, OutputableLambdas1 g) => 
OutputableLambdas1 (O f g) where
+    pprPrecLam1 (Comp x) = pprPrecLam1 (fmap Wrapper1 x)
+
+instance OutputableLambdas1 Tagged where
+    pprPrecLam1 (Tagged tg x) = second ((braces (ppr tg) <+>) .) (pprPrecLam x)
+
+instance OutputableLambdas1 Sized where
+    pprPrecLam1 (Sized sz x) = second ((bananas (text (show sz)) <>) .) 
(pprPrecLam x)
+
+pprPrecDefault :: OutputableLambdas a => Rational -> a -> SDoc
+pprPrecDefault prec e = pPrintPrecLam prec xs (PrettyFunction ppr_prec)
+  where (xs, ppr_prec) = pprPrecLam e
+
+
 -- NB: don't use GHC's pprBndr because its way too noisy, printing unfoldings 
etc
 pPrintBndr :: BindingSite -> Var -> SDoc
 pPrintBndr bs x = prettyParen needs_parens $ ppr x <+> text "::" <+> ppr 
(varType x)
@@ -122,18 +148,21 @@ instance Outputable AltCon where
         LiteralAlt l        -> pPrint l
         DefaultAlt          -> text "_"
 
-instance (Functor ann, Outputable1 ann) => Outputable (TermF ann) where
-    pprPrec prec e = case e of
-        Let x e1 e2       -> pPrintPrecLet prec x (asPrettyFunction1 e1) 
(asPrettyFunction1 e2)
-        LetRec xes e      -> pPrintPrecLetRec prec (map (second 
asPrettyFunction1) xes) (asPrettyFunction1 e)
-        Var x             -> pPrintPrec prec x
-        Value v           -> pPrintPrec prec v
-        TyApp e ty        -> pPrintPrecApp prec (asPrettyFunction1 e) ty
-        CoApp e co        -> pPrintPrecApp prec (asPrettyFunction1 e) co
-        App e x           -> pPrintPrecApp prec (asPrettyFunction1 e) x
-        PrimOp pop tys es -> pPrintPrecPrimOp prec pop (map asPrettyFunction 
tys) (map asPrettyFunction1 es)
-        Case e x _ty alts -> pPrintPrecCase prec (asPrettyFunction1 e) x (map 
(second asPrettyFunction1) alts)
-        Cast e co         -> pPrintPrecCast prec (asPrettyFunction1 e) co
+instance (Functor ann, OutputableLambdas1 ann) => Outputable (TermF ann) where
+    pprPrec = pprPrecDefault
+
+instance (Functor ann, OutputableLambdas1 ann) => OutputableLambdas (TermF 
ann) where
+    pprPrecLam e = case e of
+        Let x e1 e2       -> ([], \prec -> pPrintPrecLet prec x 
(asPrettyFunction1 e1) (asPrettyFunction1 e2))
+        LetRec xes e      -> ([], \prec -> pPrintPrecLetRec prec (map (second 
asPrettyFunction1) xes) (asPrettyFunction1 e))
+        Var x             -> ([], \prec -> pPrintPrec prec x)
+        Value v           -> pprPrecLam v
+        TyApp e ty        -> ([], \prec -> pPrintPrecApp prec 
(asPrettyFunction1 e) ty)
+        CoApp e co        -> ([], \prec -> pPrintPrecApp prec 
(asPrettyFunction1 e) co)
+        App e x           -> ([], \prec -> pPrintPrecApp prec 
(asPrettyFunction1 e) x)
+        PrimOp pop tys es -> ([], \prec -> pPrintPrecPrimOp prec pop (map 
asPrettyFunction tys) (map asPrettyFunction1 es))
+        Case e x _ty alts -> ([], \prec -> pPrintPrecCase prec 
(asPrettyFunction1 e) x (map (second asPrettyFunction1) alts))
+        Cast e co         -> ([], \prec -> pPrintPrecCast prec 
(asPrettyFunction1 e) co)
 
 pPrintPrecCast :: (Outputable a) => Rational -> a -> Coercion -> SDoc
 pPrintPrecCast prec e co = prettyParen (prec > noPrec) $ pPrintPrec opPrec e 
<+> text "|>" <+> pPrintPrec appPrec co
@@ -156,22 +185,25 @@ pPrintPrecLet prec x e e_body = prettyParen (prec > 
noPrec) $ hang (text "let")
 pPrintPrecLetRec :: (Outputable a, Outputable b) => Rational -> [(Var, a)] -> 
b -> SDoc
 pPrintPrecLetRec prec xes e_body
   | [] <- xes = pPrintPrec prec e_body
-  | otherwise = prettyParen (prec > noPrec) $ hang (text "letrec") 2 (vcat 
[pPrintBndr LetBind x <+> text "=" <+> pPrintPrec noPrec e | (x, e) <- xes]) $$ 
text "in" <+> pPrintPrec noPrec e_body
-
-instance (Functor ann, Outputable1 ann) => Outputable (ValueF ann) where
-    pprPrec prec v = case v of
-        Indirect x         -> pPrintPrec prec x
-        TyLambda x e       -> pPrintPrecLam prec [x] (asPrettyFunction1 e)
-        -- Unfortunately, this nicer pretty-printing doesn't work for general 
(TermF ann):
-        --Lambda x e     -> pPrintPrecLam prec (x:xs) e'
-        --  where (xs, e') = collectLambdas e
-        Lambda x e         -> pPrintPrecLam prec [x] (asPrettyFunction1 e)
-        Data dc tys cos xs -> pPrintPrecApps prec dc ([asPrettyFunction ty | 
ty <- tys] ++ [asPrettyFunction co | co <- cos] ++ [asPrettyFunction x | x <- 
xs])
-        Literal l          -> pPrintPrec prec l
-        Coercion co        -> pPrintPrec prec co
+  | otherwise = prettyParen (prec > noPrec) $ hang (text "letrec") 2 (vcat 
[hang (pPrintBndr LetBind x) 2 (text "=" <+> pPrintPrec noPrec e) | (x, e) <- 
xes]) $$ text "in" <+> pPrintPrec noPrec e_body
+
+instance (Functor ann, OutputableLambdas1 ann) => Outputable (ValueF ann) where
+    pprPrec = pprPrecDefault
+
+instance (Functor ann, OutputableLambdas1 ann) => OutputableLambdas (ValueF 
ann) where
+    pprPrecLam v = case v of
+        Indirect x         -> ([], flip pPrintPrec x)
+        TyLambda x e       -> (x:xs, ppr_prec)
+          where (xs, ppr_prec) = pprPrecLam1 e
+        Lambda x e         -> (x:xs, ppr_prec)
+          where (xs, ppr_prec) = pprPrecLam1 e
+        Data dc tys cos xs -> ([], \prec -> pPrintPrecApps prec dc 
([asPrettyFunction ty | ty <- tys] ++ [asPrettyFunction co | co <- cos] ++ 
[asPrettyFunction x | x <- xs]))
+        Literal l          -> ([], flip pPrintPrec l)
+        Coercion co        -> ([], flip pPrintPrec co)
 
 pPrintPrecLam :: Outputable a => Rational -> [Var] -> a -> SDoc
-pPrintPrecLam prec xs e = prettyParen (prec > noPrec) $ text "\\" <> hsep 
[pPrintBndr LambdaBind y | y <- xs] <+> text "->" <+> pPrintPrec noPrec e
+pPrintPrecLam prec [] e = pPrintPrec prec e
+pPrintPrecLam prec xs e = prettyParen (prec > noPrec) $ text "\\" <> (vcat 
[pPrintBndr LambdaBind y | y <- xs] $$ text "->" <+> pPrintPrec noPrec e)
 
 pPrintPrecApps :: (Outputable a, Outputable b) => Rational -> a -> [b] -> SDoc
 pPrintPrecApps prec e1 es2 = prettyParen (not (null es2) && prec >= appPrec) $ 
pPrintPrec opPrec e1 <+> hsep (map (pPrintPrec appPrec) es2)



_______________________________________________
Cvs-ghc mailing list
Cvs-ghc@haskell.org
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to