From b6c896a7c5be517ba12d1b069d58103b6214f09f Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 29 Mar 2023 16:06:30 +0800 Subject: [PATCH] 1 --- a8/lisp.cc | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/a8/lisp.cc b/a8/lisp.cc index 441e15e..576ea82 100644 --- a/a8/lisp.cc +++ b/a8/lisp.cc @@ -161,7 +161,7 @@ namespace a8 std::shared_ptr Expr::Compile(const std::string& script, std::shared_ptr env) { - std::vector stack; + std::vector> stack; int pos = 0; int depth = -1; while (true) { @@ -171,12 +171,17 @@ namespace a8 break; } if (token == "(") { - List new_list = std::make_shared>>(); - stack.push_back(new_list); - if (depth >= 0) { - stack.at(depth)->push_back(std::make_shared(new_list)); - } ++depth; + List new_list = std::make_shared>>(); + stack.push_back(std::make_tuple(new_list, depth)); + auto value = std::make_shared(new_list); + for (int i = stack.size() - 1; i >= 0; --i) { + auto& tuple = stack.at(i); + if (std::get<1>(tuple) < depth) { + std::get<0>(tuple)->push_back(value); + break; + } + } } else if (token == ")") { --depth; } else { @@ -184,17 +189,18 @@ namespace a8 abort(); } double val = 0.0f; + auto& tuple = stack.at(stack.size() - 1); if (sscanf(token.c_str(), "%lf", &val) == 1) { - stack.at(depth)->push_back(std::make_shared(Atom(val))); + std::get<0>(tuple)->push_back(std::make_shared(Atom(val))); } else { auto symbol = env->Find(token); if (symbol) { if (!symbol->IsType(ValueType::kCProc)) { abort(); } - stack.at(depth)->push_back(symbol); + std::get<0>(tuple)->push_back(symbol); } else { - stack.at(depth)->push_back(std::make_shared(Symbol(token))); + std::get<0>(tuple)->push_back(std::make_shared(Symbol(token))); } } } @@ -205,7 +211,7 @@ namespace a8 if (stack.empty()) { abort(); } - return std::make_shared(stack[0]); + return std::make_shared(std::get<0>(stack[0])); } bool Expr::MaybeExpr(const std::string& script)