From 88bfe4697b1dedae66720c08acbb71f7c02926aa Mon Sep 17 00:00:00 2001 From: IXtreme Date: Fri, 10 Jul 2026 22:31:08 -0400 Subject: [PATCH] trying to remove cell from register --- src/main.cpp | 58 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 8 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 43b2dbe..fd36a65 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -65,8 +65,8 @@ struct Fork : Data { struct Lambda : Data { Env env; - Cell args; - Cell f; + size_t args; + size_t f; }; enum class locs { EVAL_START, EVAL_OP_FIN, EVAL_TOP_ARG, APPLY }; @@ -101,13 +101,22 @@ struct Registers { struct Machine { size_t maxCells; size_t freepos = 1; - std::vector mem; + size_t mempty_pos = 1; + + + int activebank = 0; + std::vector bank0; + std::vector bank1; + + std::vector& mem; + std::vector& mem_empty; + std::vector stack; Registers reg; - Machine(size_t max) : mem(max) { + Machine(size_t max) : bank0(max) , bank1(max), mem(bank0), mem_empty(bank1) { maxCells = max; reg.E.builtin.insert("+"); reg.E.builtin.insert("-"); @@ -259,7 +268,11 @@ struct Machine { } } else if (Lambda *f = dynamic_cast(d)) { reg.A = f->args; - reg.A = ((Fork *)(std::get(reg.A)).d)->data; + + reg.A = ((Fork *) mem[std::get(reg.A)].d)->data; + + + //reg.A = ( (Fork *) (std::get(reg.A)).d) ->data; reg.B = reg.args_front; // reg.E = f->env; @@ -271,7 +284,11 @@ struct Machine { reg.B = mem[std::get(reg.B)].cdr; } - reg.D = f->f.d; + //reg.D = f->f.d; + + reg.D = mem[f->f].d; + + //reg.E.userdef.merge(f->env.userdef); reg.RP = locs::EVAL_START; break; @@ -336,8 +353,8 @@ struct Machine { Lambda *l = new Lambda; l->env = reg.E; - l->args = mem[cdr]; // mem[args->data]; - l->f = mem[mem[cdr].cdr]; // mem[f->data]; + l->args = cdr; // mem[args->data]; + l->f = mem[cdr].cdr; // mem[f->data]; // std::cout <<"got lambd" << std::endl; return newCell(l); } else if (fname == "progn") { @@ -393,6 +410,31 @@ struct Machine { return nc; } + + size_t newCellInEmpty() { + if (mempty_pos >= maxCells) { + throw "OOM in GC"; + } + auto nc = mempty_pos; + mempty_pos += 1; + return nc; + } + + + + // size_t MoveThingAtAddr(size_t loc) { + // auto nc = newCellInEmpty(); + // mem_empty[nc] = mem[loc]; + // mem[loc].cdr = maxCells + nc; + // return nc; + // } + + // // stop and copy gc + // void GC() { + // std::vector< + + // } + size_t newCell(Data *d) { auto t = newCell(); mem[t].d = d;