diff --git a/CMakeLists.txt b/CMakeLists.txt index 5d28cdb82..5039626e2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,6 +22,7 @@ add_library( src/Parser.cc src/Types.cc src/Checker.cc + src/Evaluator.cc ) target_link_directories( BoltCore diff --git a/include/bolt/Common.hpp b/include/bolt/Common.hpp index 2b247ef5d..158635610 100644 --- a/include/bolt/Common.hpp +++ b/include/bolt/Common.hpp @@ -25,6 +25,11 @@ namespace bolt { return Flags & ConfigFlags_TypeVarsRequireForall; } + bool hasImmediateDiagnostics() const noexcept { + // TODO make this a configuration flag + return true; + } + }; } diff --git a/src/main.cc b/src/main.cc index d0368e7b8..4664dd5cd 100644 --- a/src/main.cc +++ b/src/main.cc @@ -13,6 +13,7 @@ #include "bolt/Scanner.hpp" #include "bolt/Parser.hpp" #include "bolt/Checker.hpp" +#include "bolt/Evaluator.hpp" using namespace bolt; @@ -56,7 +57,7 @@ int main(int argc, const char* argv[]) { SF->setParents(); DiagnosticStore DS; - Checker TheChecker { Config, DS }; + Checker TheChecker { Config, DE }; // TODO set this to DS in production TheChecker.check(SF); auto LT = [](const Diagnostic* L, const Diagnostic* R) { @@ -79,6 +80,19 @@ int main(int argc, const char* argv[]) { DE.printDiagnostic(*D); } + if (DE.hasError()) { + return 1; + } + + Evaluator E; + Env TheEnv; + TheEnv.add("print", Value::binding([](auto Args) { + ZEN_ASSERT(Args.size() == 1) + std::cerr << Args[0].asString() << "\n"; + return Value::unit(); + })); + E.evaluate(SF, TheEnv); + return 0; }