/** @file Schematika.hpp * * @author Roland Conybeare, Nov 2025 **/ #pragma once #include "xo/alloc/GC.hpp" namespace xo { namespace scm { /** @class Schematika * @brief schematika interpreter state **/ class Schematika { public: class Impl; struct Config { /** true to enable welcome message **/ bool welcome_flag_ = true; /** number of command history items to preserve **/ std::size_t history_size = 100; /** on startup: load command history from this file; persist last @ref history_size commands to the same file **/ std::string history_file = "scm_history.txt"; /** when true enable console logging for repl internals **/ bool debug_flag = false; /** garbage collector configuration **/ gc::Config gc_config_; /** control schematika vsm logging **/ log_level vsm_log_level_; }; using IAlloc = xo::gc::IAlloc; public: ~Schematika(); /** create instance with configuration @p cfg **/ static Schematika make(const Config & cfg); /** interactive read-eval-print loop. * Uses replxx to read from stdin. * If stdin is interactive, accepts line editing commands: * - ctrl-a goto beginning of line * - ctrl-e goto end of line * - ctrl-k delete to end of line * - meta- backwards delete word * - meta-p| retrieve previous command from history * - meta-n| retrieve next command from history * - / page through history faster * - ctrl-s forward history search * - ctrl-r backward history search **/ void interactive_repl(); private: explicit Schematika(const Config & cfg); private: up p_impl_; }; } } /* end Schematika.hpp */