diff --git a/src/compiler.cpp b/src/compiler.cpp index a9e15f6..dbe01e6 100644 --- a/src/compiler.cpp +++ b/src/compiler.cpp @@ -1,17 +1,41 @@ #include "compiler.hpp" -Result Compiler::compile(Value& expr) { - auto env = TRY(Array::create(_arena)); - auto constants = TRY(Array::create(_arena)); +struct Context { + Context() {} + Context(Value&& env, Array&& constants) + : env(std::move(env)), + constants(std::move(constants)), + maxreg(0), + maxconst(0) {} - return compile_expr(expr); + static Result create(Arena& arena) { + auto env = TRY(Nil::create(arena)); + auto constants = TRY(Array::create(arena)); + + return Context(std::move(env), std::move(constants)); + } + + Value env; + Array constants; + uint64_t maxreg; + uint64_t maxconst; +}; + +bool is_primitive_op(Symbol& sym) { + // return (sym.cmp("+") == 0); + return false; } -Result Compiler::compile_expr(Value& expr) { - return Value(TRY(Nil::create(_arena))); +Result Compiler::compile(Value& expr) { + auto context = TRY(Context::create(_arena)); + + TRY(compile_expr(context, expr)); + return ErrorCode::NotImplemented; +} +Result Compiler::compile_expr(Context& context, Value& expr) { switch (expr.tag()) { case Tag::Pair: - return compile_list(*expr.to()); + return compile_list(context, *expr.to()); case Tag::Nil: case Tag::Bool: case Tag::Int64: @@ -27,7 +51,11 @@ Result Compiler::compile_expr(Value& expr) { return ErrorCode::TypeMismatch; } -Result Compiler::compile_list(Pair& expr) { +Result Compiler::compile_list(Context& context, Pair& expr) { auto first = TRY(expr.first(_arena)); + + if (first.is()) { + Symbol& sym = *first.to(); + } return ErrorCode::TypeMismatch; } diff --git a/src/compiler.hpp b/src/compiler.hpp index 972d610..10c0e94 100644 --- a/src/compiler.hpp +++ b/src/compiler.hpp @@ -2,13 +2,22 @@ #include "common.hpp" +struct Context; + +struct Expression { + Expression() {} + Expression(uint64_t reg, Array&& code) : reg(reg), code(std::move(code)) {} + uint64_t reg; + Array code; +}; + class Compiler { public: Compiler(Arena& arena) : _arena(arena) {} Result compile(Value& expr); - Result compile_expr(Value& expr); - Result compile_list(Pair& expr); + Result compile_expr(Context& context, Value& expr); + Result compile_list(Context& context, Pair& expr); private: Arena& _arena; diff --git a/src/vli.cpp b/src/vli.cpp index b7c3dc8..08a6779 100644 --- a/src/vli.cpp +++ b/src/vli.cpp @@ -22,7 +22,7 @@ int main() { DIEX(debug_print(arena, s2)); Compiler c = Compiler(arena); - auto compiled = DIEX(c.compile_expr(r)); + auto compiled = DIEX(c.compile(r)); return 0; }