diff --git a/a8/lisp.cc b/a8/lisp.cc index 850c659..92e3062 100644 --- a/a8/lisp.cc +++ b/a8/lisp.cc @@ -3,6 +3,7 @@ #include #include +#include namespace a8 { @@ -34,6 +35,49 @@ namespace a8 value = cproc; } + a8::XObject Value::ToXObject() + { + switch (type) { + case ValueType::kAtom: + { + Atom&& atom = std::any_cast(value); + a8::XValue v(atom.val); + return a8::XObject(v); + } + break; + case ValueType::kList: + { + auto arr = a8::MutableXObject::CreateArray(); + List list = std::any_cast(value); + for (auto ele : *list) { + a8::XObject xobj = ele->ToXObject(); + arr->Push(xobj); + } + return *arr; + } + break; + case ValueType::kSymbol: + { + Symbol&& symbol = std::any_cast(value); + auto obj = a8::MutableXObject::CreateObject(); + obj->SetVal("name", symbol.name); + return *obj; + } + break; + case ValueType::kCProc: + { + auto obj = a8::MutableXObject::CreateObject(); + return *obj; + } + break; + default: + { + abort(); + } + break; + } + } + std::shared_ptr Scope::Find(const std::string& name) { auto itr = vars_.find(name); @@ -170,7 +214,10 @@ namespace a8 token = ")"; return 1; } - while (pos < script.size() && !isspace(script[pos])) { + while (pos < script.size() && + !isspace(script[pos]) && + script[pos] != ')' && + script[pos] != '(') { token += script[pos]; ++pos; } diff --git a/a8/lisp.h b/a8/lisp.h index 6704386..c7bd48b 100644 --- a/a8/lisp.h +++ b/a8/lisp.h @@ -43,6 +43,7 @@ namespace a8 Value(Symbol symbol); Value(CProc cproc); bool IsType(ValueType t) { return t == type; }; + a8::XObject ToXObject(); }; class Scope diff --git a/a8/mutable_xobject.cc b/a8/mutable_xobject.cc index 7a82ba9..97ee933 100644 --- a/a8/mutable_xobject.cc +++ b/a8/mutable_xobject.cc @@ -31,7 +31,7 @@ namespace a8 return *this; } - a8::MutableXObject& MutableXObject::Push(a8::MutableXObject& val) + a8::MutableXObject& MutableXObject::Push(a8::XObject& val) { if (type_ != XOT_ARRAY) { abort(); diff --git a/a8/mutable_xobject.h b/a8/mutable_xobject.h index 8e6e5d3..5339b45 100644 --- a/a8/mutable_xobject.h +++ b/a8/mutable_xobject.h @@ -14,7 +14,7 @@ namespace a8 static std::shared_ptr CreateArray(); a8::MutableXObject& Push(a8::XValue val); - a8::MutableXObject& Push(a8::MutableXObject& val); + a8::MutableXObject& Push(a8::XObject& val); a8::MutableXObject& SetVal(const std::string& key, a8::XValue val); a8::MutableXObject& SetVal(const std::string& key, a8::XObject& val); a8::MutableXObject& SetVal(const std::string& key, a8::MutableXObject& val);