summaryrefslogtreecommitdiff
path: root/src/buildtool/build_engine/expression/evaluator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/buildtool/build_engine/expression/evaluator.cpp')
-rw-r--r--src/buildtool/build_engine/expression/evaluator.cpp38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/buildtool/build_engine/expression/evaluator.cpp b/src/buildtool/build_engine/expression/evaluator.cpp
index d2cee809..4499552b 100644
--- a/src/buildtool/build_engine/expression/evaluator.cpp
+++ b/src/buildtool/build_engine/expression/evaluator.cpp
@@ -82,6 +82,42 @@ auto Flatten(ExpressionPtr const& expr) -> ExpressionPtr {
return ExpressionPtr{result};
}
+auto Addition(ExpressionPtr const& expr) -> ExpressionPtr {
+ if (not expr->IsList()) {
+ throw Evaluator::EvaluationError{fmt::format(
+ "Addition expects a list, but found: {}", expr->ToString())};
+ }
+ Expression::number_t result = 0.0;
+ auto const& list = expr->List();
+ std::for_each(list.begin(), list.end(), [&](auto const& f) {
+ if (not f->IsNumber()) {
+ throw Evaluator::EvaluationError{fmt::format(
+ "Non-number entry found for argument to addition: {}",
+ f->ToString())};
+ }
+ result += f->Number();
+ });
+ return ExpressionPtr(result);
+}
+
+auto Multiplication(ExpressionPtr const& expr) -> ExpressionPtr {
+ if (not expr->IsList()) {
+ throw Evaluator::EvaluationError{fmt::format(
+ "Multiplication expects a list, but found: {}", expr->ToString())};
+ }
+ Expression::number_t result = 1.0;
+ auto const& list = expr->List();
+ std::for_each(list.begin(), list.end(), [&](auto const& f) {
+ if (not f->IsNumber()) {
+ throw Evaluator::EvaluationError{fmt::format(
+ "Non-number entry found for argument to multiplication: {}",
+ f->ToString())};
+ }
+ result *= f->Number();
+ });
+ return ExpressionPtr(result);
+}
+
auto All(ExpressionPtr const& list) -> ExpressionPtr {
for (auto const& c : list->List()) {
if (not ValueIsTrue(c)) {
@@ -954,6 +990,8 @@ auto const kBuiltInFunctions =
{"and", AndExpr},
{"or", OrExpr},
{"++", UnaryExpr(Flatten)},
+ {"+", UnaryExpr(Addition)},
+ {"*", UnaryExpr(Multiplication)},
{"nub_right", UnaryExpr(NubRight)},
{"range", UnaryExpr(Range)},
{"change_ending", ChangeEndingExpr},