* Default function arguments.

This commit is contained in:
Eelco Dolstra 2003-11-05 15:34:12 +00:00
parent 0690c1c9c0
commit 80bb477cc4
3 changed files with 17 additions and 9 deletions

View File

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

View File

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

View File

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