/** @file VirtualSchematikaMachine.cpp * * @author Roland Conybeare, Jan 2026 **/ #include "VirtualSchematikaMachine.hpp" #include #include #include #include #include #include #include namespace xo { using xo::print::APrintable; using xo::print::ppconfig; using xo::print::ppstate_standalone; using xo::mm::AGCObject; using xo::mm::DX1Collector; using xo::facet::FacetRegistry; using std::cout; namespace scm { VirtualSchematikaMachine::VirtualSchematikaMachine(const VsmConfig & config) : config_{config}, mm_(box(new DX1Collector(config.x1_config_))), reader_{config.rdr_config_, mm_.to_op()} {} VsmResult VirtualSchematikaMachine::read_eval_print(span_type input, bool eof) { if (input.empty()) { return VsmResult(); } auto [expr, remaining, error1] = reader_.read_expr(input, eof); if (!expr) { return { .remaining_input_ = remaining, .tk_error_ = error1 }; } auto [value, error2] = this->eval(expr); if (!value) { return { .remaining_input_ = remaining, .tk_error_ = error2 }; } obj value_pr = FacetRegistry::instance().variant(value); // pretty_toplevel(value_pr, &cout, ppconfig()); ppconfig ppc; ppstate_standalone pps(&cout, 0, &ppc); pps.prettyn(value_pr); return { .remaining_input_ = remaining }; } std::pair, TokenizerError> VirtualSchematikaMachine::eval(obj expr) { (void)expr; assert(false); return std::make_pair(obj(), TokenizerError()); } void VirtualSchematikaMachine::run() { while (this->execute_one()) ; } bool VirtualSchematikaMachine::execute_one() { switch (pc_.opcode()) { case vsm_opcode::halt: case vsm_opcode::N: return false; case vsm_opcode::eval: _do_eval_op(); } return true; } void VirtualSchematikaMachine::_do_eval_op() { switch(expr_.extype()) { case exprtype::invalid: case exprtype::N: break; case exprtype::constant: _do_eval_constant_op(); break; case exprtype::define: _do_eval_define_op(); break; case exprtype::lambda: _do_eval_lambda_op(); break; case exprtype::variable: _do_eval_variable_op(); break; case exprtype::apply: _do_eval_apply_op(); break; case exprtype::ifexpr: _do_eval_if_else_op(); break; case exprtype::sequence: _do_eval_sequence_op(); break; } } void VirtualSchematikaMachine::_do_eval_constant_op() { auto expr = obj::from(expr_); this->value_ = expr.data()->value(); this->pc_ = this->cont_; } void VirtualSchematikaMachine::_do_eval_define_op() { // not implemented assert(false); } void VirtualSchematikaMachine::_do_eval_lambda_op() { // not implemented assert(false); } void VirtualSchematikaMachine::_do_eval_variable_op() { // not implemented assert(false); } void VirtualSchematikaMachine::_do_eval_apply_op() { // not implemented assert(false); } void VirtualSchematikaMachine::_do_eval_if_else_op() { // not implemented assert(false); } void VirtualSchematikaMachine::_do_eval_sequence_op() { // not implemented assert(false); } } /*namespace scm*/ } /*namespace xo*/ /* end VirtualSchematikaMachine.hpp */