diff --git a/ast.hs b/ast.hs index cfcd146..ac84aa5 100644 --- a/ast.hs +++ b/ast.hs @@ -31,6 +31,7 @@ data AST = Add AST AST data Pattern = VarP String | IntP Integer + | StrP String | UnitP | ConsP Pattern Pattern | TupleP [Pattern] diff --git a/interp.hs b/interp.hs index cfff587..f9ec13e 100644 --- a/interp.hs +++ b/interp.hs @@ -199,6 +199,11 @@ patternBindings (IntP n) _ = Nothing patternBindings UnitP UnitV = Just M.empty patternBindings UnitP _ = Nothing +patternBindings (StrP x) (StrV y) + | x == y = Just M.empty + | otherwise = Nothing +patternBindings (StrP _) _ = Nothing + -- cons on strings patternBindings (ConsP x (ListP [])) (StrV (y:[])) = patternBindings x (StrV [y]) patternBindings (ConsP xp xsp) (StrV (x:xs)) = @@ -217,7 +222,7 @@ patternBindings (ConsP xp xsp) (ListV (x:xs)) = patternBindings (ConsP _ _) _ = Nothing -- lists -patternBindings (ListP []) (ListV (x:xs)) = Nothing -- not enough patterns +patternBindings (ListP []) (ListV (x:_)) = Nothing -- not enough patterns patternBindings (ListP (_:_)) (ListV []) = Nothing -- not enough values patternBindings (ListP []) (ListV []) = Just M.empty -- base case patternBindings (ListP (x:xs)) (ListV (y:ys)) = diff --git a/parser.hs b/parser.hs index f19b0e4..58f62b3 100644 --- a/parser.hs +++ b/parser.hs @@ -85,10 +85,11 @@ emptyTuple cons = do intPattern = fmap IntP integer varPattern = fmap VarP identifier +stringPattern = fmap StrP stringLiteral listPattern = listSeq pattern ListP consPattern = do - x <- intPattern <|> varPattern + x <- intPattern <|> varPattern <|> stringPattern symbol "::" y <- pattern return $ ConsP x y @@ -99,6 +100,7 @@ pattern = try consPattern <|> listPattern <|> varPattern <|> intPattern + <|> stringPattern patterns = sepBy pattern (symbol ",")