* Let syntax.

This commit is contained in:
Eelco Dolstra 2003-11-01 19:10:41 +00:00
parent a2a9bacd82
commit 1b4184ccbb
2 changed files with 14 additions and 0 deletions

View file

@ -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);
}

View file

@ -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