* Conditions, string equality.

This commit is contained in:
Eelco Dolstra 2003-11-01 19:15:08 +00:00
parent 1b4184ccbb
commit 1610444671
2 changed files with 24 additions and 6 deletions

View file

@ -106,6 +106,15 @@ Path evalPath(EvalState & state, Expr e)
} }
bool evalBool(EvalState & state, Expr e)
{
e = evalExpr(state, e);
if (ATmatch(e, "True")) return true;
else if (ATmatch(e, "False")) return false;
else throw badTerm("expecting a boolean", e);
}
Expr evalExpr2(EvalState & state, Expr e) Expr evalExpr2(EvalState & state, Expr e)
{ {
Expr e1, e2, e3, e4; Expr e1, e2, e3, e4;
@ -165,6 +174,21 @@ Expr evalExpr2(EvalState & state, Expr e)
if (ATmatch(e, "LetRec(<term>)", &e1)) if (ATmatch(e, "LetRec(<term>)", &e1))
return evalExpr(state, ATmake("Select(Rec(<term>), \"body\")", e1)); return evalExpr(state, ATmake("Select(Rec(<term>), \"body\")", e1));
/* Conditionals. */
if (ATmatch(e, "If(<term>, <term>, <term>)", &e1, &e2, &e3)) {
if (evalBool(state, e1))
return evalExpr(state, e2);
else
return evalExpr(state, e3);
}
/* Equality. Just strings for now. */
if (ATmatch(e, "OpEq(<term>, <term>)", &e1, &e2)) {
string s1 = evalString(state, e1);
string s2 = evalString(state, e2);
return s1 == s2 ? ATmake("True") : ATmake("False");
}
/* Barf. */ /* Barf. */
throw badTerm("invalid expression", e); throw badTerm("invalid expression", e);
} }

View file

@ -32,12 +32,6 @@ static Expr evalExpr2(EvalState & state, Expr e)
{ {
/* Conditional. */ /* Conditional. */
if (ATmatch(e, "If(<term>, <term>, <term>)", &e1, &e2, &e3)) { if (ATmatch(e, "If(<term>, <term>, <term>)", &e1, &e2, &e3)) {
e1 = evalExpr(state, e1);
Expr x;
if (ATmatch(e1, "True")) x = e2;
else if (ATmatch(e1, "False")) x = e3;
else throw badTerm("expecting a boolean", e1);
return evalExpr(state, x);
} }
/* Ad-hoc function for string matching. */ /* Ad-hoc function for string matching. */