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