about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2003-11-05T15·34+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2003-11-05T15·34+0000
commit80bb477cc4ea5226ae760726730b3e09d21559de (patch)
tree148773dc1fc90edb88cb2128f2db164ae5b06753
parent0690c1c9c01dd5889dbfccf2da6cb99f5c4e151b (diff)
* Default function arguments.
-rw-r--r--src/fix-ng/eval.cc13
-rw-r--r--src/fix-ng/fix-expr.cc5
-rw-r--r--src/fix-ng/fix.sdf8
3 files changed, 17 insertions, 9 deletions
diff --git a/src/fix-ng/eval.cc b/src/fix-ng/eval.cc
index 90b7ff29f2..770802f321 100644
--- a/src/fix-ng/eval.cc
+++ b/src/fix-ng/eval.cc
@@ -27,10 +27,13 @@ static Expr substArgs(Expr body, ATermList formals, Expr arg)
     /* Get the formal arguments. */
     while (!ATisEmpty(formals)) {
         ATerm t = ATgetFirst(formals);
-        char * s;
-        if (!ATmatch(t, "<str>", &s))
-            abort(); /* can't happen */
-        subs.set(t, undefined);
+        Expr name, def;
+        debug(printTerm(t));
+        if (ATmatch(t, "NoDefFormal(<term>)", &name))
+            subs.set(name, undefined);
+        else if (ATmatch(t, "DefFormal(<term>, <term>)", &name, &def))
+            subs.set(name, def);
+        else abort(); /* can't happen */
         formals = ATgetNext(formals);
     }
 
@@ -44,7 +47,7 @@ static Expr substArgs(Expr body, ATermList formals, Expr arg)
         Expr key = ATgetFirst(keys);
         Expr cur = subs.get(key);
         if (!cur)
-            throw badTerm(format("argument `%1%' not declared")
+            throw badTerm(format("function has no formal argument `%1%'")
                 % aterm2String(key), arg);
         subs.set(key, args.get(key));
     }
diff --git a/src/fix-ng/fix-expr.cc b/src/fix-ng/fix-expr.cc
index 814e186b41..6e73b29341 100644
--- a/src/fix-ng/fix-expr.cc
+++ b/src/fix-ng/fix-expr.cc
@@ -171,7 +171,10 @@ Expr substitute(const ATermMap & subs, Expr e)
         ATermMap subs2(subs);
         ATermList fs = formals;
         while (!ATisEmpty(fs)) {
-            if (!ATmatch(ATgetFirst(fs), "<str>", &s)) abort();
+            Expr def;
+            if (!ATmatch(ATgetFirst(fs), "NoDefFormal(<str>)", &s) &&
+                !ATmatch(ATgetFirst(fs), "DefFormal(<str>, <term>)", &s))
+                abort();
             subs2.remove(s);
             fs = ATgetNext(fs);
         }
diff --git a/src/fix-ng/fix.sdf b/src/fix-ng/fix.sdf
index 8e9f0fa721..9dc04d9373 100644
--- a/src/fix-ng/fix.sdf
+++ b/src/fix-ng/fix.sdf
@@ -17,7 +17,7 @@ imports Fix-Exprs Fix-Layout
 module Fix-Exprs
 imports Fix-Lexicals URI
 exports
-  sorts Expr Bind
+  sorts Expr Bind Formal
   context-free syntax
 
     Id -> Expr {cons("Var")}
@@ -34,7 +34,9 @@ exports
 
     Expr Expr -> Expr {cons("Call"), left}
 
-    "{" {Id ","}* "}" ":" Expr -> Expr {cons("Function"), right}
+    "{" {Formal ","}* "}" ":" Expr -> Expr {cons("Function"), right}
+    Id -> Formal {cons("NoDefFormal")}
+    Id "?" Expr -> Formal {cons("DefFormal")}
 
     "rec" "{" Binds "}" -> Expr {cons("Rec")}
     "let" "{" Binds "}" -> Expr {cons("LetRec")}
@@ -62,7 +64,7 @@ exports
     Expr "." Id -> Expr
   > Expr ExprList -> ExprList
   > Expr Expr -> Expr
-  > "{" {Id ","}* "}" ":" Expr -> Expr
+  > "{" {Formal ","}* "}" ":" Expr -> Expr
 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%