summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2003-11-01 19:10:41 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2003-11-01 19:10:41 +0000
commit1b4184ccbb01634792897d3412c489b989674567 (patch)
tree5284cac6187211341c82fb440cc941f776ab46e9 /src
parenta2a9bacd8296ed1ddb6105b649a062fe65c27759 (diff)
downloadguix-1b4184ccbb01634792897d3412c489b989674567.tar.gz
* Let syntax.
Diffstat (limited to 'src')
-rw-r--r--src/fix-ng/eval.cc5
-rw-r--r--src/fix-ng/fix.sdf9
2 files changed, 14 insertions, 0 deletions
diff --git a/src/fix-ng/eval.cc b/src/fix-ng/eval.cc
index 7854677416..46bb1f9418 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 cae5d2748e..251a63f0c5 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