diff options
| -rw-r--r-- | parser.sml | 28 | ||||
| -rw-r--r-- | tests/14-fun.sml | 3 |
2 files changed, 22 insertions, 9 deletions
@@ -458,15 +458,25 @@ struct const (Syntax.ECase (e, arms))))) <|> orelseExpr) st and dec : Syntax.dec parser = fn st => - (reserved "val" >> - bind (true <$ reserved "rec" <|> const false) (fn isRec => - bind pat (fn p => - reserved "=" >> - bind expr (fn e => - const - (if isRec - then Syntax.DValRec (p, e) - else Syntax.DVal (p, e)))))) st + ((reserved "val" >> + bind (true <$ reserved "rec" <|> const false) (fn isRec => + bind pat (fn p => + reserved "=" >> + bind expr (fn e => + const + (if isRec + then Syntax.DValRec (p, e) + else Syntax.DVal (p, e)))))) + <|> (reserved "fun" >> + bind identifier (fn name => + bind (many1 atpat) (fn args => + reserved "=" >> + bind expr (fn body => + const + (Syntax.DValRec + ( Syntax.PVar name + , foldr Syntax.ELambda body args + ))))))) st val program : Syntax.expr parser = (fn decs => Syntax.ELet (decs, Syntax.EInt 0)) <$> many dec fun parse (f : string) : (string, Syntax.expr) Result.either = runParser program f diff --git a/tests/14-fun.sml b/tests/14-fun.sml new file mode 100644 index 0000000..210b30d --- /dev/null +++ b/tests/14-fun.sml @@ -0,0 +1,3 @@ +fun f x y = __builtin "exit" (__builtin "sub" (x, y)) + +val _ = f 60 18 |
