From 61e4f761c1adf3a03bf65f0491931438b9c71f80 Mon Sep 17 00:00:00 2001 From: bog Date: Sun, 15 Oct 2023 04:36:02 +0200 Subject: [PATCH] :sparkles: $IN and $OUT special variables. --- src/Interpreter.cpp | 21 +++++++++++++++++++-- tests/Interpreter.cpp | 16 +++++++++++++++- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/Interpreter.cpp b/src/Interpreter.cpp index c533cfa..c0904ad 100644 --- a/src/Interpreter.cpp +++ b/src/Interpreter.cpp @@ -143,8 +143,15 @@ namespace sn } else if (node->type() == NODE_VAR) { - auto var = *m_sym.get(node->repr()); - return var.values; + if (auto var = m_sym.get(node->repr()); + var) + { + return var->values; + } + else + { + throw run_error {"cannot find variable '" + node->repr() + "'"}; + } } else if (node->type() == NODE_ARRAY) { @@ -280,12 +287,16 @@ namespace sn auto block = *node->get(2); std::vector target_values; + std::vector target_values_verbatim; for (size_t i=0; isize(); i++) { auto t = *target_node->get(i); auto values = get_value(t); + std::copy(std::begin(values), std::end(values), + std::back_inserter(target_values_verbatim)); + std::transform(std::begin(values), std::end(values), std::back_inserter(target_values), @@ -294,12 +305,16 @@ namespace sn } std::vector dep_values; + std::vector dep_values_verbatim; for (size_t i=0; isize(); i++) { auto d = *deps->get(i); auto values = get_value(d); + std::copy(std::begin(values), std::end(values), + std::back_inserter(dep_values_verbatim)); + std::transform(std::begin(values), std::end(values), std::back_inserter(dep_values), std::bind(&Interpreter::format_path, this, @@ -313,6 +328,8 @@ namespace sn m_dependencies[target].push_back(dep); } + m_sym.declare("IN", dep_values_verbatim); + m_sym.declare("OUT", target_values_verbatim); m_scripts[target] = scripts(block); } } break; diff --git a/tests/Interpreter.cpp b/tests/Interpreter.cpp index 095adda..7f547d4 100644 --- a/tests/Interpreter.cpp +++ b/tests/Interpreter.cpp @@ -79,7 +79,7 @@ public: void test_contains(std::string const& str, std::vector vec) { - INFO("'" << str << "' not found"); + INFO("'" << str << "' not found, got '" << vec[0] << "'"); REQUIRE(std::find(std::begin(vec), std::end(vec), str) != std::end(vec)); } @@ -319,3 +319,17 @@ TEST_CASE_METHOD(InterpreterTest, "Interpreter_replace_ext") test_contains("x.h y.h z.d w t.h", res); } } + +TEST_CASE_METHOD(InterpreterTest, "Interpreter_in_out") +{ + SECTION("on array") + { + std::stringstream ss; + ss << "x y z -> a b c {" << std::endl; + ss << "$IN $OUT" << std::endl; + ss << "}" << std::endl; + + auto res = TEST_RUN(ss.str(), std::filesystem::path("a")); + test_contains("a b c x y z", res); + } +}