about summary refs log tree commit diff
path: root/src/fix-ng/eval.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/fix-ng/eval.cc')
-rw-r--r--src/fix-ng/eval.cc24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/fix-ng/eval.cc b/src/fix-ng/eval.cc
index 46bb1f94188d..c58a06dff8d9 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);
 }