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.hs62
1 files changed, 29 insertions, 33 deletions
diff --git a/src/AST/Pretty.hs b/src/AST/Pretty.hs
index dbbc021..5610d36 100644
--- a/src/AST/Pretty.hs
+++ b/src/AST/Pretty.hs
@@ -1,16 +1,15 @@
-{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE DataKinds #-}
-{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE DeriveFunctor #-}
+{-# LANGUAGE EmptyCase #-}
{-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE PolyKinds #-}
-{-# LANGUAGE EmptyCase #-}
-{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE TupleSections #-}
-module AST.Pretty where
+{-# LANGUAGE TypeOperators #-}
+module AST.Pretty (ppExpr) where
import Control.Monad (ap)
import Data.List (intersperse)
-import Data.Foldable (toList)
import Data.Functor.Const
import AST
@@ -29,10 +28,6 @@ valprj (VPush x _) IZ = x
valprj (VPush _ env) (IS i) = valprj env i
valprj VTop i = case i of {}
-vpushN :: Vec n a -> Val (Const a) env -> Val (Const a) (ConsN n TIx env)
-vpushN VNil v = v
-vpushN (name :< names) v = VPush (Const name) (vpushN names v)
-
newtype M a = M { runM :: Int -> (a, Int) }
deriving (Functor)
instance Applicative M where { pure x = M (\i -> (x, i)) ; (<*>) = ap }
@@ -115,12 +110,10 @@ ppExpr' d val = \case
EBuild _ n a b -> do
a' <- ppExpr' 11 val a
- names <- sequence (vecGenerate n (\_ -> genName)) -- TODO generate underscores
- e' <- ppExpr' 0 (vpushN names val) b
+ name <- genNameIfUsedIn (tTup (sreplicate n tIx)) IZ b
+ e' <- ppExpr' 0 (VPush (Const name) val) b
return $ showParen (d > 10) $
- showString "build " . a' . showString " (\\["
- . foldr (.) id (intersperse (showString ",") (map showString (reverse (toList names))))
- . showString ("] -> ") . e' . showString ")"
+ showString "build " . a' . showString (" (\\" ++ name ++ " -> ") . e' . showString ")"
EFold1 _ a b -> do
name1 <- genNameIfUsedIn (typeOf a) (IS IZ) a
@@ -135,9 +128,9 @@ ppExpr' d val = \case
e' <- ppExpr' 11 val e
return $ showParen (d > 10) $ showString "unit " . e'
- EReplicate _ e -> do
- e' <- ppExpr' 11 val e
- return $ showParen (d > 10) $ showString "replicate " . e'
+ -- EReplicate _ e -> do
+ -- e' <- ppExpr' 11 val e
+ -- return $ showParen (d > 10) $ showString "replicate " . e'
EConst _ ty v -> return $ showString $ case ty of
STI32 -> show v ; STI64 -> show v ; STF32 -> show v ; STF64 -> show v ; STBool -> show v
@@ -151,14 +144,15 @@ ppExpr' d val = \case
b' <- ppExpr' 9 val b
return $ showParen (d > 8) $ a' . showString " ! " . b'
- EIdx _ e es -> do
- e' <- ppExpr' 9 val e
- es' <- traverse (ppExpr' 0 val) es
+ EIdx _ _ a b -> do
+ a' <- ppExpr' 9 val a
+ b' <- ppExpr' 10 val b
return $ showParen (d > 8) $
- e' . showString " ! "
- . showString "["
- . foldr (.) id (intersperse (showString ", ") (reverse (toList es')))
- . showString "]"
+ a' . showString " !! " . b'
+
+ EShape _ e -> do
+ e' <- ppExpr' 11 val e
+ return $ showParen (d > 10) $ showString "shape " . e'
EOp _ op (EPair _ a b)
| (Infix, ops) <- operator op -> do
@@ -175,30 +169,30 @@ ppExpr' d val = \case
EWith e1 e2 -> do
e1' <- ppExpr' 11 val e1
- let STArr n t = typeOf e1
- name <- genNameIfUsedIn' "ac" (STAccum n t) IZ e2
- e2' <- ppExpr' 11 (VPush (Const name) val) e2
+ name <- genNameIfUsedIn' "ac" (STAccum (typeOf e1)) IZ e2
+ e2' <- ppExpr' 0 (VPush (Const name) val) e2
return $ showParen (d > 10) $
showString "with " . e1' . showString (" (\\" ++ name ++ " -> ")
. e2' . showString ")"
- EAccum1 e1 e2 e3 -> do
+ EAccum i e1 e2 e3 -> do
e1' <- ppExpr' 11 val e1
e2' <- ppExpr' 11 val e2
e3' <- ppExpr' 11 val e3
return $ showParen (d > 10) $
- showString "accum1 " . e1' . showString " " . e2' . showString " " . e3'
+ showString ("accum " ++ show (unSNat i) ++ " ") . e1' . showString " " . e2' . showString " " . e3'
EError _ s -> return $ showParen (d > 10) $ showString ("error " ++ show s)
ppExprLet :: Int -> SVal env -> Expr x env t -> M ShowS
ppExprLet d val etop = do
- let collect :: SVal env -> Expr x env t -> M ([(String, ShowS)], ShowS)
+ let collect :: SVal env -> Expr x env t -> M ([(String, Occ, ShowS)], ShowS)
collect val' (ELet _ rhs body) = do
+ let occ = occCount IZ body
name <- genNameIfUsedIn (typeOf rhs) IZ body
rhs' <- ppExpr' 0 val' rhs
(binds, core) <- collect (VPush (Const name) val') body
- return ((name, rhs') : binds, core)
+ return ((name, occ, rhs') : binds, core)
collect val' e = ([],) <$> ppExpr' 0 val' e
(binds, core) <- collect val etop
@@ -210,7 +204,9 @@ ppExprLet d val etop = do
showString ("let " ++ open)
. foldr (.) id
(intersperse (showString " ; ")
- (map (\(name, rhs) -> showString (name ++ " = ") . rhs) binds))
+ (map (\(name, _occ, rhs) ->
+ showString (name ++ {- " (" ++ show _occ ++ ")" ++ -} " = ") . rhs)
+ binds))
. showString (close ++ " in ")
. core