@@ -3,7 +3,7 @@ module Parse.Patterns (patternTerm, patternExpr, makeLambda, flattenPatterns) wh
5import Located
5import Located
6−import Control.Applicative ((<$>),(<*>))
6+import Control.Applicative ((<$>),(<*>),(*>),pure)
7import Control.Monad
7import Control.Monad
8import Control.Monad.State
8import Control.Monad.State
9import Data.Char (isUpper)
9import Data.Char (isUpper)
@@ -19,6 +19,12 @@ patternBasic =
19 return $ if isUpper c then PData x [] else PVar x
19 return $ if isUpper c then PData x [] else PVar x
22+patternMaybeAsVar :: Pattern -> IParser Pattern
25+ (optional whitespace *> reserved "as" *> whitespace *> lowVar) <*> pure x,
22patternRecord :: IParser Pattern
28patternRecord :: IParser Pattern
23patternRecord = PRecord <$> brackets (commaSep1 lowVar)
29patternRecord = PRecord <$> brackets (commaSep1 lowVar)
@@ -30,14 +36,17 @@ patternList :: IParser Pattern
30patternList = plist <$> braces (commaSep patternExpr)
36patternList = plist <$> braces (commaSep patternExpr)
32patternTerm :: IParser Pattern
38patternTerm :: IParser Pattern
33−patternTerm = choice [ patternRecord, patternTuple, patternList, patternBasic ]
39+patternTerm = (choice [ patternRecord, patternTuple, patternList,
34− <?> "pattern"
41+ <?> "pattern"
36patternConstructor :: IParser Pattern
43patternConstructor :: IParser Pattern
37patternConstructor = PData <$> capVar <*> spacePrefix patternTerm
44patternConstructor = PData <$> capVar <*> spacePrefix patternTerm
39patternExpr :: IParser Pattern
46patternExpr :: IParser Pattern
47+patternExpr = (patternMaybeAsVar =<<
40−patternExpr = foldr1 pcons <$> consSep1 (patternConstructor <|> patternTerm) <?> "pattern"
48+ (foldr1 pcons <$> consSep1 (patternConstructor <|> patternTerm)))
42makeLambda :: [Pattern] -> CExpr -> GuidCounter CExpr
51makeLambda :: [Pattern] -> CExpr -> GuidCounter CExpr
43makeLambda pats body = go (reverse pats) body
52makeLambda pats body = go (reverse pats) body
@@ -53,6 +62,10 @@ extract pattern body@(L t s _) =
53 case pattern of
62 case pattern of
54 PAnything -> return $ fn "_" body
63 PAnything -> return $ fn "_" body
55 PVar x -> return $ fn x body
64 PVar x -> return $ fn x body
65+ PAsVar x PAnything -> return $ fn x body
67+ (x', body') <- extract p body
68+ return $ fn x (loc $ Let [FnDef x' [] (loc $ Var x)] body')
56 PData name ps -> do
69 PData name ps -> do
58 let a = '_' : show x
71 let a = '_' : show x
@@ -97,6 +110,10 @@ matchSingle pat exp@(L t s _) p =
97 PVar x ->
110 PVar x ->
98 return [ FnDef x [] (loc $ Case exp [(pat, loc $ Var x)]) ]
111 return [ FnDef x [] (loc $ Case exp [(pat, loc $ Var x)]) ]
114+ subPat <- matchSingle p' (loc $ Var x) p'
115+ return $ (FnDef x [] (loc $ Case exp [(pat, loc $ Var x)])):subPat
100 PRecord fs -> do
117 PRecord fs -> do
101 a <- (\x -> '_' : show x) `liftM` guid
118 a <- (\x -> '_' : show x) `liftM` guid
102 let toDef f = FnDef f [] (loc $ Access (loc $ Var a) f)
119 let toDef f = FnDef f [] (loc $ Access (loc $ Var a) f)