diff --git a/a8/lisp.cc b/a8/lisp.cc index 1f5cbc2..055fe13 100644 --- a/a8/lisp.cc +++ b/a8/lisp.cc @@ -43,14 +43,46 @@ namespace a8 vars_[name] = std::make_shared(proc); } - bool Expr::Compile(const std::string& script, std::shared_ptr scope) + std::shared_ptr Expr::Compile(const std::string& script, std::shared_ptr scope) { } - std::vector> Expr::Eval(std::shared_ptr scope) + std::shared_ptr Expr::Eval(std::shared_ptr x, std::shared_ptr env) { - + while (true) { + switch (x->type) { + case ValueType::kAtom: + { + return x; + } + break; + case ValueType::kSymbol: + { + Symbol&& symbol = std::any_cast(x->value); + return env->Find(symbol.name); + } + break; + case ValueType::kList: + { + List&& list = std::any_cast(x->value); + auto leader = list.at(0); + if (leader->type != ValueType::kCProc) { + abort(); + } + CProc&& cproc = std::any_cast(leader->value); + List exps = List(list.begin() + 1, list.end()); + return cproc(exps); + } + break; + default: + { + abort(); + return nullptr; + } + break; + } + } } } diff --git a/a8/lisp.h b/a8/lisp.h index 929b094..16a8f08 100644 --- a/a8/lisp.h +++ b/a8/lisp.h @@ -21,7 +21,7 @@ namespace a8 }; struct Value; typedef std::vector> List; - typedef std::function CProc; + typedef std::function(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); - std::vector> Eval(std::shared_ptr scope); - - List GetExprList() { return list_; }; + std::shared_ptr Compile(const std::string& script, std::shared_ptr scope); + std::shared_ptr Eval(std::shared_ptr x, std::shared_ptr env); private: - - List list_; - }; }