separate eval into eval and apply and do gc (oops)
This commit is contained in:
parent
2532dd9f4a
commit
0572264f76
3 changed files with 22 additions and 20 deletions
2
Makefile
2
Makefile
|
|
@ -1,4 +1,4 @@
|
||||||
CFLAGS := -std=c99 -Og -g -Wpedantic -Wall
|
CFLAGS := -std=gnu99 -Og -g -Wpedantic -Wall
|
||||||
OBJS := symbol.o object.o gc.o print.o eval.o main.o
|
OBJS := symbol.o object.o gc.o print.o eval.o main.o
|
||||||
|
|
||||||
wscm: $(OBJS)
|
wscm: $(OBJS)
|
||||||
|
|
|
||||||
38
eval.c
38
eval.c
|
|
@ -171,6 +171,26 @@ V setupenv(O *env) {
|
||||||
*env = cons(mkprim("if", prim_if), *env);
|
*env = cons(mkprim("if", prim_if), *env);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
O apply(O fn, O args, O env) {
|
||||||
|
I k = kind(fn);
|
||||||
|
switch (k) {
|
||||||
|
case KIND_PRIM: {
|
||||||
|
P *p = (P *)UNTAG(fn);
|
||||||
|
return p->fn(args, env);
|
||||||
|
}
|
||||||
|
case KIND_CLOS: {
|
||||||
|
H *h = UNBOX(fn);
|
||||||
|
L *l = (L *)(h + 1);
|
||||||
|
args = evallist(args, env);
|
||||||
|
O nenv = bind(l->args, args, l->env);
|
||||||
|
return eval(l->body, nenv);
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "tried to call non-function value\n");
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
O eval(O obj, O env) {
|
O eval(O obj, O env) {
|
||||||
I k = kind(obj);
|
I k = kind(obj);
|
||||||
|
|
||||||
|
|
@ -194,23 +214,7 @@ O eval(O obj, O env) {
|
||||||
O fn = eval(c->car, env);
|
O fn = eval(c->car, env);
|
||||||
addroot(&fn);
|
addroot(&fn);
|
||||||
|
|
||||||
I fk = kind(fn);
|
O res = apply(fn, c->cdr, env);
|
||||||
O res = NIL;
|
|
||||||
|
|
||||||
if (fk == KIND_PRIM) {
|
|
||||||
P *p = (P *)UNTAG(fn);
|
|
||||||
res = p->fn(c->cdr, env);
|
|
||||||
} else if (fk == KIND_CLOS) {
|
|
||||||
H *h = UNBOX(fn);
|
|
||||||
L *l = (L *)(h + 1);
|
|
||||||
O args = evallist(c->cdr, env);
|
|
||||||
O nenv = bind(l->args, args, l->env);
|
|
||||||
res = eval(l->body, nenv);
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "tried to call non-function value\n");
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
|
|
||||||
rootreset(mark);
|
rootreset(mark);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
2
gc.c
2
gc.c
|
|
@ -60,8 +60,6 @@ static O forward(O obj, U8 **freep) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void collect(void) {
|
void collect(void) {
|
||||||
return; // DEBUG
|
|
||||||
|
|
||||||
U8 *freep = heap.to.start;
|
U8 *freep = heap.to.start;
|
||||||
U8 *scan = freep;
|
U8 *scan = freep;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue