diff options
Diffstat (limited to 'src/AST/Pretty.hs')
-rw-r--r-- | src/AST/Pretty.hs | 72 |
1 files changed, 64 insertions, 8 deletions
diff --git a/src/AST/Pretty.hs b/src/AST/Pretty.hs index c1d6c88..e793ce1 100644 --- a/src/AST/Pretty.hs +++ b/src/AST/Pretty.hs @@ -10,6 +10,7 @@ module AST.Pretty where import Control.Monad (ap) import Data.List (intersperse) +import Data.Foldable (toList) import Data.Functor.Const import AST @@ -26,6 +27,10 @@ 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 } @@ -88,11 +93,11 @@ ppExpr' d val = \case EInl _ _ e -> do e' <- ppExpr' 11 val e - return $ showParen (d > 10) $ showString "inl " . e' + return $ showParen (d > 10) $ showString "Inl " . e' EInr _ _ e -> do e' <- ppExpr' 11 val e - return $ showParen (d > 10) $ showString "inr " . e' + return $ showParen (d > 10) $ showString "Inr " . e' ECase _ e a b -> do e' <- ppExpr' 0 val e @@ -104,9 +109,50 @@ ppExpr' d val = \case showString "case " . e' . showString (" of { Inl " ++ name1 ++ " -> ") . a' . showString (" ; Inr " ++ name2 ++ " -> ") . b' . showString " }" + EBuild1 _ a b -> do + a' <- ppExpr' 11 val a + name <- genName + 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 + e' <- ppExpr' 0 (vpushN names val) e + return $ showParen (d > 10) $ + showString "build [" + . foldr (.) id (intersperse (showString ", ") (reverse (toList es'))) + . showString "] (\\[" + . foldr (.) id (intersperse (showString ",") (map showString (reverse (toList names)))) + . showString ("] -> ") . e' . showString ")" + + EFold1 _ a b -> do + name1 <- genName + name2 <- genName + a' <- ppExpr' 0 (VPush (Const name2) (VPush (Const name1) val)) a + b' <- ppExpr' 11 val b + return $ showParen (d > 10) $ + showString ("fold1 (\\" ++ name1 ++ " " ++ name2 ++ " -> ") . a' + . showString ") " . b' + EConst _ ty v -> return $ showString $ case ty of STI32 -> show v ; STI64 -> show v ; STF32 -> show v ; STF64 -> show v ; STBool -> show v + EIdx1 _ a b -> do + a' <- ppExpr' 9 val a + 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 + return $ showParen (d > 8) $ + e' . showString " ! " + . showString "[" + . foldr (.) id (intersperse (showString ", ") (reverse (toList es'))) + . showString "]" + EOp _ op (EPair _ a b) | (Infix, ops) <- operator op -> do a' <- ppExpr' 9 val a @@ -139,6 +185,22 @@ ppExpr' d val = \case e' <- ppExpr' 11 val e return $ showParen (d > 10) $ showString ("return ") . e' + etop@(EMBind _ EMBind{}) -> do + let collect :: SVal env -> Expr x env t -> M ([(String, ShowS)], ShowS) + collect val' (EMBind lhs cont) = do + name <- genName + (binds, core) <- collect (VPush (Const name) val') cont + lhs' <- ppExpr' 0 val' lhs + return ((name, lhs') : binds, core) + collect val' e = ([],) <$> ppExpr' 0 val' e + + (binds, core) <- collect val etop + return $ showParen (d > 0) $ + showString "do { " + . foldr (.) id (intersperse (showString " ; ") + (map (\(name, rhs) -> showString (name ++ " <- ") . rhs) binds)) + . showString " ; " . core . showString " }" + EMBind a b -> do a' <- ppExpr' 0 val a name <- genName @@ -147,8 +209,6 @@ ppExpr' d val = \case EError _ s -> return $ showParen (d > 10) $ showString ("error " ++ show s) - _ -> undefined - data Fixity = Prefix | Infix deriving (Show) @@ -160,7 +220,3 @@ operator OLt{} = (Infix, "<") operator OLe{} = (Infix, "<=") operator OEq{} = (Infix, "==") operator ONot = (Prefix, "not") - -idx2int :: Idx env t -> Int -idx2int IZ = 0 -idx2int (IS n) = 1 + idx2int n |