From 02e1c8d38fd8af690741aa8f587a2255ed89521f Mon Sep 17 00:00:00 2001 From: yhirose Date: Sun, 5 Jul 2015 22:30:35 -0400 Subject: [PATCH] Implemented method to display array object. --- language/interpreter.cc | 17 ++++++---------- language/interpreter.hpp | 43 +++++++++++++++++++++++++--------------- 2 files changed, 33 insertions(+), 27 deletions(-) diff --git a/language/interpreter.cc b/language/interpreter.cc index 45ecf73..2b1f969 100644 --- a/language/interpreter.cc +++ b/language/interpreter.cc @@ -101,8 +101,7 @@ private: }; static Value eval_function_call(const Ast& ast, shared_ptr env) { - const auto& var = ast.nodes[0]->token; - const auto& f = env->get(var); + const auto& f = eval(*ast.nodes[0], env); const auto& fv = f.to_function(); const auto& args = ast.nodes[1]->nodes; @@ -122,7 +121,7 @@ private: return fv.eval(callEnv); } - string msg = "arguments error in '" + var + "'..."; + string msg = "arguments error..."; throw runtime_error(msg); } @@ -141,15 +140,11 @@ private: } static Value eval_array_reference(const Ast& ast, shared_ptr env) { - const auto& var = ast.nodes[0]->token; + const auto& a = eval(*ast.nodes[0], env).to_array(); + const auto& i = eval(*ast.nodes[1], env).to_long(); - const auto& a = env->get(var); - const auto& av = a.to_array(); - - const auto& idx = eval(*ast.nodes[1], env).to_long(); - - if (0 <= idx && idx < av.values.size()) { - return av.values[idx]; + if (0 <= i && i < a.values.size()) { + return a.values[i]; } return Value(); diff --git a/language/interpreter.hpp b/language/interpreter.hpp index 68ca291..363269a 100644 --- a/language/interpreter.hpp +++ b/language/interpreter.hpp @@ -92,6 +92,19 @@ struct Value throw std::runtime_error("type error."); } + std::string str_array() const { + const auto& values = to_array().values; + std::string s = "["; + for (auto i = 0u; i < values.size(); i++) { + if (i != 0) { + s += ", "; + } + s += values[i].str(); + } + s += "]"; + return s; + } + std::string str() const { switch (type) { case Undefined: return "undefined"; @@ -99,31 +112,24 @@ struct Value case Long: return std::to_string(to_long()); break; case String: return to_string(); case Function: return "[function]"; - case Array: return "[array]"; + case Array: return str_array(); default: throw std::logic_error("invalid internal condition."); } // NOTREACHED } std::ostream& out(std::ostream& os) const { - switch (type) { - case Undefined: os << "undefined"; break; - case Bool: os << (to_bool() ? "true" : "false"); break; - case Long: os << to_long(); break; - case String: os << "'" << to_string() << "'"; break; - case Function: os << "[function]"; break; - case Array: os << "[array]"; break; - default: throw std::logic_error("invalid internal condition."); - } + os << str(); return os; } bool operator==(const Value& rhs) const { switch (type) { - case Undefined: return true; + case Undefined: return true; case Bool: return to_bool() == rhs.to_bool(); case Long: return to_long() == rhs.to_long(); case String: return to_string() == rhs.to_string(); + // TODO: Array support default: throw std::logic_error("invalid internal condition."); } // NOTREACHED @@ -131,10 +137,11 @@ struct Value bool operator!=(const Value& rhs) const { switch (type) { - case Undefined: return false; + case Undefined: return false; case Bool: return to_bool() != rhs.to_bool(); case Long: return to_long() != rhs.to_long(); case String: return to_string() != rhs.to_string(); + // TODO: Array support default: throw std::logic_error("invalid internal condition."); } // NOTREACHED @@ -142,10 +149,11 @@ struct Value bool operator<=(const Value& rhs) const { switch (type) { - case Undefined: return false; + case Undefined: return false; case Bool: return to_bool() <= rhs.to_bool(); case Long: return to_long() <= rhs.to_long(); case String: return to_string() <= rhs.to_string(); + // TODO: Array support default: throw std::logic_error("invalid internal condition."); } // NOTREACHED @@ -153,10 +161,11 @@ struct Value bool operator<(const Value& rhs) const { switch (type) { - case Undefined: return false; + case Undefined: return false; case Bool: return to_bool() < rhs.to_bool(); case Long: return to_long() < rhs.to_long(); case String: return to_string() < rhs.to_string(); + // TODO: Array support default: throw std::logic_error("invalid internal condition."); } // NOTREACHED @@ -164,10 +173,11 @@ struct Value bool operator>=(const Value& rhs) const { switch (type) { - case Undefined: return false; + case Undefined: return false; case Bool: return to_bool() >= rhs.to_bool(); case Long: return to_long() >= rhs.to_long(); case String: return to_string() >= rhs.to_string(); + // TODO: Array support default: throw std::logic_error("invalid internal condition."); } // NOTREACHED @@ -175,10 +185,11 @@ struct Value bool operator>(const Value& rhs) const { switch (type) { - case Undefined: return false; + case Undefined: return false; case Bool: return to_bool() > rhs.to_bool(); case Long: return to_long() > rhs.to_long(); case String: return to_string() > rhs.to_string(); + // TODO: Array support default: throw std::logic_error("invalid internal condition."); } // NOTREACHED