From 3506e1282ae8ce56bce4832a8ca5935c06bc3a6d Mon Sep 17 00:00:00 2001 From: darkf Date: Sat, 19 Oct 2013 01:56:14 -0700 Subject: [PATCH] add multiple pattern arguments in parser --- ast.hs | 2 +- parser.hs | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/ast.hs b/ast.hs index cf216ea..57d9381 100644 --- a/ast.hs +++ b/ast.hs @@ -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])] diff --git a/parser.hs b/parser.hs index 002573d..8664a6a 100644 --- a/parser.hs +++ b/parser.hs @@ -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