@@ -1,8 +1,11 @@
2module Ast where
2module Ast where
4+import Data.Char (isDigit)
5+import Data.List (intercalate)
4data Pattern = PData String [Pattern] | PVar String | PAnything
7data Pattern = PData String [Pattern] | PVar String | PAnything
5− deriving (Show, Eq)
8+ deriving (Eq)
7data Expr = Number Int
10data Expr = Number Int
8 | Chr Char
11 | Chr Char
@@ -37,3 +40,17 @@ pcons h t = PData "Cons" [h,t]
37pnil = PData "Nil" []
40pnil = PData "Nil" []
38plist = foldr pcons pnil
41plist = foldr pcons pnil
39ptuple es = PData ("Tuple" ++ show (length es)) es
42ptuple es = PData ("Tuple" ++ show (length es)) es
44+parens s = "(" ++ s ++ ")"
46+instance Show Pattern where
49+ show (PData "Cons" [hd@(PData "Cons" _),tl]) =
50+ parens (show hd) ++ " : " ++ show tl
51+ show (PData "Cons" [hd,tl]) = show hd ++ " : " ++ show tl
52+ show (PData "Nil" []) = "[]"
53+ show (PData name ps) =
54+ if take 5 name == "Tuple" && all isDigit (drop 5 name) then
55+ parens . intercalate ", " $ map show ps
56+ else (if null ps then id else parens) $ unwords (name : map show ps)