@@ -19,6 +19,13 @@ 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
28+
2229patternRecord :: IParser Pattern
2330patternRecord = PRecord <$> brackets (commaSep1 lowVar)
2431
@@ -30,7 +37,8 @@ patternList :: IParser Pattern
3037patternList = plist <$> braces (commaSep patternExpr)
3138
3239patternTerm :: IParser Pattern
33−patternTerm = choice [ patternRecord, patternTuple, patternList, patternBasic ]
40+patternTerm = choice [ patternRecord, patternTuple, patternList,
41+ patternMaybeAtVar =<< patternBasic ]
3442 <?> "pattern"
3543
3644patternConstructor :: IParser Pattern
@@ -53,6 +61,10 @@ extract pattern body@(L t s _) =
5361 case pattern of
5462 PAnything -> return $ fn "_" body
5563 PVar x -> return $ fn x body
64+ PAtVar x PAnything -> return $ fn x body
65+ PAtVar x p -> do
66+ (x', body') <- extract p body
67+ return $ fn x (loc $ Let [FnDef x' [] (loc $ Var x)] body')
5668 PData name ps -> do
5769 x <- guid
5870 let a = '_' : show x
@@ -97,6 +109,10 @@ matchSingle pat exp@(L t s _) p =
97109 PVar x ->
98110 return [ FnDef x [] (loc $ Case exp [(pat, loc $ Var x)]) ]
99111
112+ PAtVar x p' -> do
113+ subPat <- matchSingle p' (loc $ Var x) p'
114+ return $ (FnDef x [] (loc $ Case exp [(pat, loc $ Var x)])):subPat
115+
100116 PRecord fs -> do
101117 a <- (\x -> '_' : show x) `liftM` guid
102118 let toDef f = FnDef f [] (loc $ Access (loc $ Var a) f)