summaryrefslogtreecommitdiff
path: root/src/AST/Pretty.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/AST/Pretty.hs')
-rw-r--r--src/AST/Pretty.hs38
1 files changed, 24 insertions, 14 deletions
diff --git a/src/AST/Pretty.hs b/src/AST/Pretty.hs
index e793ce1..289294d 100644
--- a/src/AST/Pretty.hs
+++ b/src/AST/Pretty.hs
@@ -14,6 +14,7 @@ import Data.Foldable (toList)
import Data.Functor.Const
import AST
+import AST.Count
data Val f env where
@@ -42,6 +43,12 @@ genId = M (\i -> (i, i + 1))
genName :: M String
genName = ('x' :) . show <$> genId
+genNameIfUsedIn :: STy a -> Idx env a -> Expr x env t -> M String
+genNameIfUsedIn ty idx ex
+ | occCount idx ex == mempty = case ty of STNil -> return "()"
+ _ -> return "_"
+ | otherwise = genName
+
ppExpr :: SList STy env -> Expr x env t -> String
ppExpr senv e = fst (runM (mkVal senv >>= \val -> ppExpr' 0 val e) 1) ""
where
@@ -59,7 +66,7 @@ ppExpr' d val = \case
etop@ELet{} -> do
let collect :: SVal env -> Expr x env t -> M ([(String, ShowS)], ShowS)
collect val' (ELet _ rhs body) = do
- name <- genName
+ name <- genNameIfUsedIn (typeOf rhs) IZ body
(binds, core) <- collect (VPush (Const name) val') body
rhs' <- ppExpr' 0 val' rhs
return ((name, rhs') : binds, core)
@@ -101,9 +108,10 @@ ppExpr' d val = \case
ECase _ e a b -> do
e' <- ppExpr' 0 val e
- name1 <- genName
+ let STEither t1 t2 = typeOf e
+ name1 <- genNameIfUsedIn t1 IZ a
a' <- ppExpr' 0 (VPush (Const name1) val) a
- name2 <- genName
+ name2 <- genNameIfUsedIn t2 IZ b
b' <- ppExpr' 0 (VPush (Const name2) val) b
return $ showParen (d > 0) $
showString "case " . e' . showString (" of { Inl " ++ name1 ++ " -> ") . a'
@@ -111,14 +119,14 @@ ppExpr' d val = \case
EBuild1 _ a b -> do
a' <- ppExpr' 11 val a
- name <- genName
+ name <- genNameIfUsedIn (STScal STI64) IZ b
b' <- ppExpr' 0 (VPush (Const name) val) b
return $ showParen (d > 10) $
showString "build1 " . a' . showString (" (\\" ++ name ++ " -> ") . b' . showString ")"
EBuild _ es e -> do
es' <- mapM (ppExpr' 0 val) es
- names <- mapM (const genName) es
+ names <- mapM (const genName) es -- TODO generate underscores
e' <- ppExpr' 0 (vpushN names val) e
return $ showParen (d > 10) $
showString "build ["
@@ -128,8 +136,8 @@ ppExpr' d val = \case
. showString ("] -> ") . e' . showString ")"
EFold1 _ a b -> do
- name1 <- genName
- name2 <- genName
+ name1 <- genNameIfUsedIn (typeOf a) (IS IZ) a
+ name2 <- genNameIfUsedIn (typeOf a) IZ a
a' <- ppExpr' 0 (VPush (Const name2) (VPush (Const name1) val)) a
b' <- ppExpr' 11 val b
return $ showParen (d > 10) $
@@ -185,10 +193,11 @@ ppExpr' d val = \case
e' <- ppExpr' 11 val e
return $ showParen (d > 10) $ showString ("return ") . e'
- etop@(EMBind _ EMBind{}) -> do
+ etop@(EMBind _ _) -> do
let collect :: SVal env -> Expr x env t -> M ([(String, ShowS)], ShowS)
collect val' (EMBind lhs cont) = do
- name <- genName
+ let STEVM _ t = typeOf lhs
+ name <- genNameIfUsedIn t IZ cont
(binds, core) <- collect (VPush (Const name) val') cont
lhs' <- ppExpr' 0 val' lhs
return ((name, lhs') : binds, core)
@@ -201,11 +210,11 @@ ppExpr' d val = \case
(map (\(name, rhs) -> showString (name ++ " <- ") . rhs) binds))
. showString " ; " . core . showString " }"
- EMBind a b -> do
- a' <- ppExpr' 0 val a
- name <- genName
- b' <- ppExpr' 0 (VPush (Const name) val) b
- return $ showParen (d > 10) $ a' . showString (" >>= \\" ++ name ++ " -> ") . b'
+ -- EMBind a b -> do
+ -- a' <- ppExpr' 0 val a
+ -- name <- genNameIfUsedIn IZ b
+ -- b' <- ppExpr' 0 (VPush (Const name) val) b
+ -- return $ showParen (d > 10) $ a' . showString (" >>= \\" ++ name ++ " -> ") . b'
EError _ s -> return $ showParen (d > 10) $ showString ("error " ++ show s)
@@ -220,3 +229,4 @@ operator OLt{} = (Infix, "<")
operator OLe{} = (Infix, "<=")
operator OEq{} = (Infix, "==")
operator ONot = (Prefix, "not")
+operator OIf = (Prefix, "ifB")