From 34b86f22fddce09c6d45d4ba743cc9d1f4eceff9 Mon Sep 17 00:00:00 2001 From: Rose Hogenson Date: Sat, 4 May 2024 15:54:23 -0700 Subject: Add "fun" syntax. --- parser.sml | 28 +++++++++++++++++++--------- tests/14-fun.sml | 3 +++ 2 files changed, 22 insertions(+), 9 deletions(-) create mode 100644 tests/14-fun.sml diff --git a/parser.sml b/parser.sml index e4c7359..c1432f2 100644 --- a/parser.sml +++ b/parser.sml @@ -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 -- cgit v1.3.1