trying to remove cell from register
This commit is contained in:
parent
2c64b5b231
commit
88bfe4697b
1 changed files with 50 additions and 8 deletions
58
src/main.cpp
58
src/main.cpp
|
|
@ -65,8 +65,8 @@ struct Fork : Data {
|
||||||
|
|
||||||
struct Lambda : Data {
|
struct Lambda : Data {
|
||||||
Env env;
|
Env env;
|
||||||
Cell args;
|
size_t args;
|
||||||
Cell f;
|
size_t f;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class locs { EVAL_START, EVAL_OP_FIN, EVAL_TOP_ARG, APPLY };
|
enum class locs { EVAL_START, EVAL_OP_FIN, EVAL_TOP_ARG, APPLY };
|
||||||
|
|
@ -101,13 +101,22 @@ struct Registers {
|
||||||
struct Machine {
|
struct Machine {
|
||||||
size_t maxCells;
|
size_t maxCells;
|
||||||
size_t freepos = 1;
|
size_t freepos = 1;
|
||||||
std::vector<Cell> mem;
|
size_t mempty_pos = 1;
|
||||||
|
|
||||||
|
|
||||||
|
int activebank = 0;
|
||||||
|
std::vector<Cell> bank0;
|
||||||
|
std::vector<Cell> bank1;
|
||||||
|
|
||||||
|
std::vector<Cell>& mem;
|
||||||
|
std::vector<Cell>& mem_empty;
|
||||||
|
|
||||||
|
|
||||||
std::vector<Registers> stack;
|
std::vector<Registers> stack;
|
||||||
|
|
||||||
Registers reg;
|
Registers reg;
|
||||||
|
|
||||||
Machine(size_t max) : mem(max) {
|
Machine(size_t max) : bank0(max) , bank1(max), mem(bank0), mem_empty(bank1) {
|
||||||
maxCells = max;
|
maxCells = max;
|
||||||
reg.E.builtin.insert("+");
|
reg.E.builtin.insert("+");
|
||||||
reg.E.builtin.insert("-");
|
reg.E.builtin.insert("-");
|
||||||
|
|
@ -259,7 +268,11 @@ struct Machine {
|
||||||
}
|
}
|
||||||
} else if (Lambda *f = dynamic_cast<Lambda *>(d)) {
|
} else if (Lambda *f = dynamic_cast<Lambda *>(d)) {
|
||||||
reg.A = f->args;
|
reg.A = f->args;
|
||||||
reg.A = ((Fork *)(std::get<Cell>(reg.A)).d)->data;
|
|
||||||
|
reg.A = ((Fork *) mem[std::get<size_t>(reg.A)].d)->data;
|
||||||
|
|
||||||
|
|
||||||
|
//reg.A = ( (Fork *) (std::get<Cell>(reg.A)).d) ->data;
|
||||||
|
|
||||||
reg.B = reg.args_front;
|
reg.B = reg.args_front;
|
||||||
// reg.E = f->env;
|
// reg.E = f->env;
|
||||||
|
|
@ -271,7 +284,11 @@ struct Machine {
|
||||||
reg.B = mem[std::get<size_t>(reg.B)].cdr;
|
reg.B = mem[std::get<size_t>(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.E.userdef.merge(f->env.userdef);
|
||||||
reg.RP = locs::EVAL_START;
|
reg.RP = locs::EVAL_START;
|
||||||
break;
|
break;
|
||||||
|
|
@ -336,8 +353,8 @@ struct Machine {
|
||||||
|
|
||||||
Lambda *l = new Lambda;
|
Lambda *l = new Lambda;
|
||||||
l->env = reg.E;
|
l->env = reg.E;
|
||||||
l->args = mem[cdr]; // mem[args->data];
|
l->args = cdr; // mem[args->data];
|
||||||
l->f = mem[mem[cdr].cdr]; // mem[f->data];
|
l->f = mem[cdr].cdr; // mem[f->data];
|
||||||
// std::cout <<"got lambd" << std::endl;
|
// std::cout <<"got lambd" << std::endl;
|
||||||
return newCell(l);
|
return newCell(l);
|
||||||
} else if (fname == "progn") {
|
} else if (fname == "progn") {
|
||||||
|
|
@ -393,6 +410,31 @@ struct Machine {
|
||||||
return nc;
|
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) {
|
size_t newCell(Data *d) {
|
||||||
auto t = newCell();
|
auto t = newCell();
|
||||||
mem[t].d = d;
|
mem[t].d = d;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue