diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/fix-ng/eval.cc | 5 | ||||
-rw-r--r-- | src/fix-ng/fix.sdf | 9 |
2 files changed, 14 insertions, 0 deletions
diff --git a/src/fix-ng/eval.cc b/src/fix-ng/eval.cc index 785467741631..46bb1f94188d 100644 --- a/src/fix-ng/eval.cc +++ b/src/fix-ng/eval.cc @@ -160,6 +160,11 @@ Expr evalExpr2(EvalState & state, Expr e) if (ATmatch(e, "Rec([<list>])", &bnds)) return expandRec(e, (ATermList) bnds); + /* Let expressions `let {..., body = ...}' are just desugared + into `(rec {..., body = ...}).body'. */ + if (ATmatch(e, "LetRec(<term>)", &e1)) + return evalExpr(state, ATmake("Select(Rec(<term>), \"body\")", e1)); + /* Barf. */ throw badTerm("invalid expression", e); } diff --git a/src/fix-ng/fix.sdf b/src/fix-ng/fix.sdf index cae5d2748e1d..251a63f0c5fb 100644 --- a/src/fix-ng/fix.sdf +++ b/src/fix-ng/fix.sdf @@ -47,6 +47,9 @@ exports "rec" "{" {Bind ","}* "}" -> Expr {cons("Rec")} + "let" "{" {Bind ","}* "}" + -> Expr {cons("LetRec")} + "{" {Bind ","}* "}" -> Expr {cons("Attrs")} @@ -59,6 +62,12 @@ exports Expr "." Id -> Expr {cons("Select")} + "if" Expr "then" Expr "else" Expr + -> Expr {cons("If")} + + Expr "==" Expr + -> Expr {cons("OpEq")} + context-free priorities Expr "." Id -> Expr |