add multiple pattern arguments in parser

This commit is contained in:
darkf 2013-10-19 01:56:14 -07:00
parent 7aa23e4800
commit 3506e1282a
2 changed files with 11 additions and 5 deletions

2
ast.hs
View File

@ -3,7 +3,7 @@ module AST where
data AST = Add AST AST
| Mul AST AST
| Block [AST]
| FunDef String (Pattern, AST)
| FunDef String ([Pattern], AST)
| Def String AST
| Var String
| Lambda [(Pattern, [AST])]

View File

@ -43,18 +43,24 @@ pattern = option UnitP $
fmap VarP identifier
<|> fmap IntP integer
patterns = sepBy pattern (symbol ",")
funDef = do
name <- identifier
symbol "("
pat <- pattern
pats <- patterns
let pats' = if pats == [] then [UnitP] else pats -- at least Unit
symbol ")"
symbol "->"
lst <- exprparser
return $ rewriteFun (FunDef name (pat, lst))
return $ rewriteFun (FunDef name (pats, lst))
-- curry FunDef to a definition of lambdas
rewriteFun (FunDef name (pattern, body)) =
Def name $ Lambda [(pattern, [body])]
rewriteFun (FunDef name (patterns, body)) =
Def name lam
where
-- curry it
lam = foldr (\pat lam -> Lambda [(pat, [lam])]) body patterns
call = do
name <- identifier