From fa18f1f184ba89b3dfe592e77a276da42d326f42 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Wed, 5 Nov 2003 16:27:40 +0000 Subject: * Assertions. * Logical operators (!, &&, ||, ->). --- src/fix-ng/eval.cc | 43 ++++++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 11 deletions(-) (limited to 'src/fix-ng/eval.cc') diff --git a/src/fix-ng/eval.cc b/src/fix-ng/eval.cc index 770802f321fb..1f131fb7b0df 100644 --- a/src/fix-ng/eval.cc +++ b/src/fix-ng/eval.cc @@ -13,11 +13,6 @@ EvalState::EvalState() } -Expr getAttr(EvalState & state, Expr e, const string & name) -{ -} - - /* Substitute an argument set into the body of a function. */ static Expr substArgs(Expr body, ATermList formals, Expr arg) { @@ -142,7 +137,8 @@ Expr evalExpr2(EvalState & state, Expr e) ATmatch(e, "Bool()", &e1) || ATmatch(e, "Function([], )", &e1, &e2) || ATmatch(e, "Attrs([])", &e1) || - ATmatch(e, "List([])", &e1)) + ATmatch(e, "List([])", &e1) || + ATmatch(e, "Null", &e1)) return e; /* Any encountered variables must be undeclared or primops. */ @@ -163,6 +159,8 @@ Expr evalExpr2(EvalState & state, Expr e) if (primop == "derivation") return primDerivation(state, e2); if (primop == "toString") return primToString(state, e2); if (primop == "baseNameOf") return primBaseNameOf(state, e2); + if (primop == "null") return primNull(state, e2); + if (primop == "isNull") return primIsNull(state, e2); else throw badTerm("undefined variable/primop", e1); } @@ -200,13 +198,36 @@ Expr evalExpr2(EvalState & state, Expr e) return evalExpr(state, e3); } - /* Equality. Just strings for now. */ - if (ATmatch(e, "OpEq(, )", &e1, &e2)) { - string s1 = evalString(state, e1); - string s2 = evalString(state, e2); - return s1 == s2 ? ATmake("Bool(True)") : ATmake("Bool(False)"); + /* Assertions. */ + if (ATmatch(e, "Assert(, )", &e1, &e2)) { + if (!evalBool(state, e1)) throw badTerm("guard failed", e); + return evalExpr(state, e2); } + /* Generic equality. */ + if (ATmatch(e, "OpEq(, )", &e1, &e2)) + return makeBool(evalExpr(state, e1) == evalExpr(state, e2)); + + /* Generic inequality. */ + if (ATmatch(e, "OpNEq(, )", &e1, &e2)) + return makeBool(evalExpr(state, e1) != evalExpr(state, e2)); + + /* Negation. */ + if (ATmatch(e, "OpNot()", &e1)) + return makeBool(!evalBool(state, e1)); + + /* Implication. */ + if (ATmatch(e, "OpImpl(, )", &e1, &e2)) + return makeBool(!evalBool(state, e1) || evalBool(state, e2)); + + /* Conjunction (logical AND). */ + if (ATmatch(e, "OpAnd(, )", &e1, &e2)) + return makeBool(evalBool(state, e1) && evalBool(state, e2)); + + /* Disjunction (logical OR). */ + if (ATmatch(e, "OpOr(, )", &e1, &e2)) + return makeBool(evalBool(state, e1) || evalBool(state, e2)); + /* Barf. */ throw badTerm("invalid expression", e); } -- cgit 1.4.1