@@ -3,7 +3,7 @@ module Parse.Patterns (patternTerm, patternExpr, makeLambda, flattenPatterns) wh
33
44import Ast
55import Located
6−import Control.Applicative ((<$>),(<*>))
6+import Control.Applicative ((<$>),(<*>),(*>),pure)
77import Control.Monad
88import Control.Monad.State
99import Data.Char (isUpper)
@@ -19,12 +19,11 @@ patternBasic =
1919 return $ if isUpper c then PData x [] else PVar x
2020 ]
2121
22−patternMaybeAtVar :: Pattern -> IParser Pattern
23−patternMaybeAtVar (PVar x) =
24− (char '@' >>
25− PAtVar x <$> patternExpr) <|>
26− ({- empty -} return $ PVar x)
27−patternMaybeAtVar x = return x
22+patternMaybeAsVar :: Pattern -> IParser Pattern
23+patternMaybeAsVar x =
24+ choice [ PAsVar <$>
25+ (optional whitespace *> reserved "as" *> whitespace *> lowVar) <*> pure x,
26+ pure x ]
2827
2928patternRecord :: IParser Pattern
3029patternRecord = PRecord <$> brackets (commaSep1 lowVar)
@@ -37,15 +36,17 @@ patternList :: IParser Pattern
3736patternList = plist <$> braces (commaSep patternExpr)
3837
3938patternTerm :: IParser Pattern
40−patternTerm = choice [ patternRecord, patternTuple, patternList,
41− patternMaybeAtVar =<< patternBasic ]
42− <?> "pattern"
39+patternTerm = (choice [ patternRecord, patternTuple, patternList,
40+ patternBasic ])
41+ <?> "pattern"
4342
4443patternConstructor :: IParser Pattern
4544patternConstructor = PData <$> capVar <*> spacePrefix patternTerm
4645
4746patternExpr :: IParser Pattern
48−patternExpr = foldr1 pcons <$> consSep1 (patternConstructor <|> patternTerm) <?> "pattern"
47+patternExpr = (patternMaybeAsVar =<<
48+ (foldr1 pcons <$> consSep1 (patternConstructor <|> patternTerm)))
49+ <?> "pattern"
4950
5051makeLambda :: [Pattern] -> CExpr -> GuidCounter CExpr
5152makeLambda pats body = go (reverse pats) body
@@ -61,8 +62,8 @@ extract pattern body@(L t s _) =
6162 case pattern of
6263 PAnything -> return $ fn "_" body
6364 PVar x -> return $ fn x body
64− PAtVar x PAnything -> return $ fn x body
65− PAtVar x p -> do
65+ PAsVar x PAnything -> return $ fn x body
66+ PAsVar x p -> do
6667 (x', body') <- extract p body
6768 return $ fn x (loc $ Let [FnDef x' [] (loc $ Var x)] body')
6869 PData name ps -> do
@@ -109,7 +110,7 @@ matchSingle pat exp@(L t s _) p =
109110 PVar x ->
110111 return [ FnDef x [] (loc $ Case exp [(pat, loc $ Var x)]) ]
111112
112− PAtVar x p' -> do
113+ PAsVar x p' -> do
113114 subPat <- matchSingle p' (loc $ Var x) p'
114115 return $ (FnDef x [] (loc $ Case exp [(pat, loc $ Var x)])):subPat
115116