diff --git a/src/main.cpp b/src/main.cpp index 0251d91..5c6d528 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,25 @@ -#include "VM.h" #include +#include "MemoryContext.h" +#include "Parser.h" +#include "VM.h" + int main() { + MemoryContext mc; + Handle repl; + { + Parser parser; + parser.loadStr("(READ EVAL PRINT STOP)"); + repl = parser.parseExpr(); + } + + while (true) { + VM vm; + std::cout << std::endl; + vm.loadControl(repl); + vm.run(); + std::cout << std::endl; + } + return 0; } diff --git a/src/vm/includes/VM.h b/src/vm/includes/VM.h index 4ecbe94..ff33b12 100644 --- a/src/vm/includes/VM.h +++ b/src/vm/includes/VM.h @@ -55,6 +55,7 @@ private: Handle EVAL = Handle::makeStrCell("EVAL"); Handle PRINT = Handle::makeStrCell("PRINT"); + Handle READ = Handle::makeStrCell("READ"); Handle CONS = Handle::makeStrCell("CONS"); }; diff --git a/src/vm/src/Compiler.cpp b/src/vm/src/Compiler.cpp index be29a30..b046af2 100644 --- a/src/vm/src/Compiler.cpp +++ b/src/vm/src/Compiler.cpp @@ -54,6 +54,8 @@ Handle Compiler::compile(Handle src, Handle fake_env, Handle suffix) { if (car.strval() == "+") { out.splice(compileArgsRaw(cdr)); out.append(Handle("ADD")); + } else if (car.strval() == "read") { + out.append(Handle("READ")); } else if (car.strval() == "lambda") { out.append(Handle("LDF")); out.append(compile(cdr.cdr().car(), Handle::cons(cdr.car(), fake_env), Handle("RET"))); diff --git a/src/vm/src/Parser.cpp b/src/vm/src/Parser.cpp index 9335cb2..f092892 100644 --- a/src/vm/src/Parser.cpp +++ b/src/vm/src/Parser.cpp @@ -69,6 +69,7 @@ void Parser::Tokenizer::load(std::string_view input) { while (curpos != std::string_view::npos) { if (alnum.find(input.at(curpos)) != std::string::npos) { std::string_view::size_type end = input.find_first_not_of(alnum, curpos); + if (end == std::string_view ::npos) end = input.size(); _tokens.emplace(input.cbegin() + curpos, input.cbegin() + end); curpos = end; } else if (special.find(input.at(curpos)) != std::string::npos) { diff --git a/src/vm/src/VM.cpp b/src/vm/src/VM.cpp index 291ecd4..16cf8f1 100644 --- a/src/vm/src/VM.cpp +++ b/src/vm/src/VM.cpp @@ -7,6 +7,7 @@ #include #include "Compiler.h" +#include "Parser.h" #include "VM.h" @@ -136,7 +137,13 @@ void VM::step() { newc.splice(_c); _c = newc; } else if (poppedH == PRINT) { - _outstream << _s.pop().val(); + _outstream << _s.pop(); + } else if (poppedH == READ) { + std::string read; + std::getline(_instream, read); + Parser parser; + parser.loadStr(read); + _s.push(parser.parseExpr()); } else { assert(false); }