diff --git a/Makefile b/Makefile index fd0ed4e..f107a6a 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ -CFLAGS := -std=c99 -Og -g -Wpedantic -Wall -OBJS := symbol.o object.o gc.o print.o eval.o main.o +CFLAGS := -std=gnu99 -Og -g -Wpedantic -Wall +OBJS := symbol.o object.o gc.o print.o read.o eval.o main.o wscm: $(OBJS) $(CC) $(OBJS) -o wscm diff --git a/eval.c b/eval.c index 11a5483..c199cf7 100644 --- a/eval.c +++ b/eval.c @@ -171,6 +171,26 @@ V setupenv(O *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) { I k = kind(obj); @@ -194,23 +214,7 @@ O eval(O obj, O env) { O fn = eval(c->car, env); addroot(&fn); - I fk = kind(fn); - 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(); - } - + O res = apply(fn, c->cdr, env); rootreset(mark); return res; } diff --git a/gc.c b/gc.c index 2fbaa35..f80838a 100644 --- a/gc.c +++ b/gc.c @@ -60,8 +60,6 @@ static O forward(O obj, U8 **freep) { } void collect(void) { - return; // DEBUG - U8 *freep = heap.to.start; U8 *scan = freep;