summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--parser.sml28
-rw-r--r--tests/14-fun.sml3
2 files changed, 22 insertions, 9 deletions
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