forked from lix-project/lix
* Conditions, string equality.
This commit is contained in:
parent
1b4184ccbb
commit
1610444671
2 changed files with 24 additions and 6 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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. */
|
||||||
|
|
Loading…
Reference in a new issue