From 092ada8479928e02a63b24e030cad907029275a2 Mon Sep 17 00:00:00 2001 From: Riyyi Date: Mon, 27 Nov 2023 12:52:23 +0100 Subject: [PATCH] Repl+Env+Example: Load global outer environment in Repl::init --- example/src/main.cpp | 21 +++++++++++++++------ src/blaze/env/environment.cpp | 3 +++ src/blaze/repl.cpp | 14 ++++++++++---- src/blaze/repl.h | 4 +++- 4 files changed, 31 insertions(+), 11 deletions(-) diff --git a/example/src/main.cpp b/example/src/main.cpp index a6f29ff..5f3759a 100644 --- a/example/src/main.cpp +++ b/example/src/main.cpp @@ -21,6 +21,13 @@ namespace blaze { +static auto cleanup(int signal) -> void +{ + print("\033[0m\n"); + Repl::cleanup(); + std::exit(signal); +} + auto main(int argc, char* argv[]) -> int { bool dump_lexer = false; @@ -39,17 +46,17 @@ auto main(int argc, char* argv[]) -> int arg_parser.addArgument(arguments, "arguments", nullptr, nullptr, ruc::ArgParser::Required::No); arg_parser.parse(argc, argv); + Repl::init(); + + // Signal callbacks + std::signal(SIGINT, cleanup); + std::signal(SIGTERM, cleanup); + // Set settings g_outer_env->set("*DUMP-LEXER*", makePtr(dump_lexer)); g_outer_env->set("*DUMP-READER*", makePtr(dump_reader)); g_outer_env->set("*PRETTY-PRINT*", makePtr(pretty_print)); - // Signal callbacks - std::signal(SIGINT, Repl::cleanup); - std::signal(SIGTERM, Repl::cleanup); - - Environment::loadFunctions(); - Environment::installFunctions(g_outer_env); Repl::makeArgv(g_outer_env, arguments); if (arguments.size() > 0) { @@ -73,6 +80,8 @@ auto main(int argc, char* argv[]) -> int print("\033[0m"); } + Repl::cleanup(); + return 0; } diff --git a/src/blaze/env/environment.cpp b/src/blaze/env/environment.cpp index e88b6b6..3d96aaa 100644 --- a/src/blaze/env/environment.cpp +++ b/src/blaze/env/environment.cpp @@ -79,6 +79,9 @@ EnvironmentPtr Environment::create(const ValuePtr lambda, ValueVector&& argument void Environment::loadFunctions() { + s_function_parts.clear(); + s_lambdas.clear(); + loadCollectionAccess(); loadCollectionConstructor(); loadCollectionModify(); diff --git a/src/blaze/repl.cpp b/src/blaze/repl.cpp index 4df86dc..472b9df 100644 --- a/src/blaze/repl.cpp +++ b/src/blaze/repl.cpp @@ -25,12 +25,18 @@ namespace blaze { Readline g_readline; -EnvironmentPtr g_outer_env = Environment::create(); +EnvironmentPtr g_outer_env; -auto Repl::cleanup(int signal) -> void +auto Repl::init() -> void { - ::print("\033[0m\n"); - std::exit(signal); + g_outer_env = Environment::create(); + Environment::loadFunctions(); + Environment::installFunctions(g_outer_env); +} + +auto Repl::cleanup() -> void +{ + g_outer_env = nullptr; } auto Repl::readline(const std::string& prompt) -> ValuePtr diff --git a/src/blaze/repl.h b/src/blaze/repl.h index 9a8081f..99e6d89 100644 --- a/src/blaze/repl.h +++ b/src/blaze/repl.h @@ -17,7 +17,9 @@ namespace blaze { class Repl { public: - static auto cleanup(int signal) -> void; + static auto init() -> void; + static auto cleanup() -> void; + static auto eval(ValuePtr ast, EnvironmentPtr env) -> ValuePtr; static auto makeArgv(EnvironmentPtr env, std::vector arguments) -> void; static auto print(ValuePtr value) -> std::string;