@@ -19,6 +19,13 @@ patternBasic =
19 return $ if isUpper c then PData x [] else PVar x
19 return $ if isUpper c then PData x [] else PVar x
22+patternMaybeAtVar :: Pattern -> IParser Pattern
23+patternMaybeAtVar (PVar x) =
25+ PAtVar x <$> patternExpr) <|>
26+ ({- empty -} return $ PVar x)
27+patternMaybeAtVar x = return x
22patternRecord :: IParser Pattern
29patternRecord :: IParser Pattern
23patternRecord = PRecord <$> brackets (commaSep1 lowVar)
30patternRecord = PRecord <$> brackets (commaSep1 lowVar)
@@ -30,7 +37,8 @@ patternList :: IParser Pattern
30patternList = plist <$> braces (commaSep patternExpr)
37patternList = plist <$> braces (commaSep patternExpr)
32patternTerm :: IParser Pattern
39patternTerm :: IParser Pattern
33−patternTerm = choice [ patternRecord, patternTuple, patternList, patternBasic ]
40+patternTerm = choice [ patternRecord, patternTuple, patternList,
41+ patternMaybeAtVar =<< patternBasic ]
34 <?> "pattern"
42 <?> "pattern"
36patternConstructor :: IParser Pattern
44patternConstructor :: IParser Pattern
@@ -53,6 +61,10 @@ extract pattern body@(L t s _) =
53 case pattern of
61 case pattern of
54 PAnything -> return $ fn "_" body
62 PAnything -> return $ fn "_" body
55 PVar x -> return $ fn x body
63 PVar x -> return $ fn x body
64+ PAtVar x PAnything -> return $ fn x body
66+ (x', body') <- extract p body
67+ return $ fn x (loc $ Let [FnDef x' [] (loc $ Var x)] body')
56 PData name ps -> do
68 PData name ps -> do
58 let a = '_' : show x
70 let a = '_' : show x
@@ -97,6 +109,10 @@ matchSingle pat exp@(L t s _) p =
97 PVar x ->
109 PVar x ->
98 return [ FnDef x [] (loc $ Case exp [(pat, loc $ Var x)]) ]
110 return [ FnDef x [] (loc $ Case exp [(pat, loc $ Var x)]) ]
113+ subPat <- matchSingle p' (loc $ Var x) p'
114+ return $ (FnDef x [] (loc $ Case exp [(pat, loc $ Var x)])):subPat
100 PRecord fs -> do
116 PRecord fs -> do
101 a <- (\x -> '_' : show x) `liftM` guid
117 a <- (\x -> '_' : show x) `liftM` guid
102 let toDef f = FnDef f [] (loc $ Access (loc $ Var a) f)
118 let toDef f = FnDef f [] (loc $ Access (loc $ Var a) f)