This commit is contained in:
aozhiwei 2023-03-03 13:17:30 +08:00
parent 0707a2b229
commit f0b4b7aa16
2 changed files with 39 additions and 11 deletions

View File

@ -43,14 +43,46 @@ namespace a8
vars_[name] = std::make_shared<Value>(proc);
}
bool Expr::Compile(const std::string& script, std::shared_ptr<Scope> scope)
std::shared_ptr<Value> Expr::Compile(const std::string& script, std::shared_ptr<Scope> scope)
{
}
std::vector<std::shared_ptr<const Value>> Expr::Eval(std::shared_ptr<Scope> scope)
std::shared_ptr<Value> Expr::Eval(std::shared_ptr<Value> x, std::shared_ptr<Scope> env)
{
while (true) {
switch (x->type) {
case ValueType::kAtom:
{
return x;
}
break;
case ValueType::kSymbol:
{
Symbol&& symbol = std::any_cast<Symbol>(x->value);
return env->Find(symbol.name);
}
break;
case ValueType::kList:
{
List&& list = std::any_cast<List>(x->value);
auto leader = list.at(0);
if (leader->type != ValueType::kCProc) {
abort();
}
CProc&& cproc = std::any_cast<CProc>(leader->value);
List exps = List(list.begin() + 1, list.end());
return cproc(exps);
}
break;
default:
{
abort();
return nullptr;
}
break;
}
}
}
}

View File

@ -21,7 +21,7 @@ namespace a8
};
struct Value;
typedef std::vector<std::shared_ptr<Value>> List;
typedef std::function<const List(const List)> CProc;
typedef std::function<std::shared_ptr<Value>(const List)> CProc;
struct Atom
{
@ -42,6 +42,7 @@ namespace a8
Value(List list);
Value(Symbol symbol);
Value(CProc cproc);
bool IsType(ValueType t) { return t == type; };
};
class Scope
@ -59,15 +60,10 @@ namespace a8
{
public:
bool Compile(const std::string& script, std::shared_ptr<Scope> scope);
std::vector<std::shared_ptr<const Value>> Eval(std::shared_ptr<Scope> scope);
List GetExprList() { return list_; };
std::shared_ptr<Value> Compile(const std::string& script, std::shared_ptr<Scope> scope);
std::shared_ptr<Value> Eval(std::shared_ptr<Value> x, std::shared_ptr<Scope> env);
private:
List list_;
};
}