1
This commit is contained in:
parent
df13a1e451
commit
8cf0d04a93
49
a8/lisp.cc
49
a8/lisp.cc
@ -3,6 +3,7 @@
|
||||
#include <ctype.h>
|
||||
|
||||
#include <a8/lisp.h>
|
||||
#include <a8/mutable_xobject.h>
|
||||
|
||||
namespace a8
|
||||
{
|
||||
@ -34,6 +35,49 @@ namespace a8
|
||||
value = cproc;
|
||||
}
|
||||
|
||||
a8::XObject Value::ToXObject()
|
||||
{
|
||||
switch (type) {
|
||||
case ValueType::kAtom:
|
||||
{
|
||||
Atom&& atom = std::any_cast<Atom>(value);
|
||||
a8::XValue v(atom.val);
|
||||
return a8::XObject(v);
|
||||
}
|
||||
break;
|
||||
case ValueType::kList:
|
||||
{
|
||||
auto arr = a8::MutableXObject::CreateArray();
|
||||
List list = std::any_cast<List>(value);
|
||||
for (auto ele : *list) {
|
||||
a8::XObject xobj = ele->ToXObject();
|
||||
arr->Push(xobj);
|
||||
}
|
||||
return *arr;
|
||||
}
|
||||
break;
|
||||
case ValueType::kSymbol:
|
||||
{
|
||||
Symbol&& symbol = std::any_cast<Symbol>(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<Value> 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;
|
||||
}
|
||||
|
@ -43,6 +43,7 @@ namespace a8
|
||||
Value(Symbol symbol);
|
||||
Value(CProc cproc);
|
||||
bool IsType(ValueType t) { return t == type; };
|
||||
a8::XObject ToXObject();
|
||||
};
|
||||
|
||||
class Scope
|
||||
|
@ -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();
|
||||
|
@ -14,7 +14,7 @@ namespace a8
|
||||
static std::shared_ptr<a8::MutableXObject> 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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user