aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2003-11-01 19:15:08 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2003-11-01 19:15:08 +0000
commit16104446712acf7e381039199eaf39dfa0fcea35 (patch)
treef5f9126a42304fbaba7632773cafc5b1a5ab226f
parent1b4184ccbb01634792897d3412c489b989674567 (diff)
* Conditions, string equality.
-rw-r--r--src/fix-ng/eval.cc24
-rw-r--r--src/fix-ng/fix.cc6
2 files changed, 24 insertions, 6 deletions
diff --git a/src/fix-ng/eval.cc b/src/fix-ng/eval.cc
index 46bb1f941..c58a06dff 100644
--- a/src/fix-ng/eval.cc
+++ b/src/fix-ng/eval.cc
@@ -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 e1, e2, e3, e4;
@@ -165,6 +174,21 @@ Expr evalExpr2(EvalState & state, Expr e)
if (ATmatch(e, "LetRec(<term>)", &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. */
throw badTerm("invalid expression", e);
}
diff --git a/src/fix-ng/fix.cc b/src/fix-ng/fix.cc
index d791461bd..1c37a0b7b 100644
--- a/src/fix-ng/fix.cc
+++ b/src/fix-ng/fix.cc
@@ -32,12 +32,6 @@ static Expr evalExpr2(EvalState & state, Expr e)
{
/* Conditional. */
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. */