pass interpreter context to pair_unwrap
This commit is contained in:
parent
91714d1025
commit
5504f6b123
7 changed files with 66 additions and 58 deletions
68
src/prim.c
68
src/prim.c
|
|
@ -2,11 +2,11 @@
|
|||
#include <stdlib.h>
|
||||
#include <wolflisp.h>
|
||||
|
||||
static O nextarg(O *list) {
|
||||
static O nextarg(In *in, O *list) {
|
||||
if (*list == NIL)
|
||||
return NIL;
|
||||
O arg = pair_unwrap(*list)->head;
|
||||
*list = pair_unwrap(*list)->tail;
|
||||
O arg = pair_unwrap(in, *list)->head;
|
||||
*list = pair_unwrap(in, *list)->tail;
|
||||
return arg;
|
||||
}
|
||||
|
||||
|
|
@ -28,8 +28,8 @@ O prim_make(In *in, const char *name, O (*fn)(In *, O, O)) {
|
|||
|
||||
O prim_cons(In *in, O args, O env) {
|
||||
args = interp_eval_list(in, args, env);
|
||||
O head = nextarg(&args);
|
||||
O tail = nextarg(&args);
|
||||
O head = nextarg(in, &args);
|
||||
O tail = nextarg(in, &args);
|
||||
return pair_make(in, head, tail);
|
||||
}
|
||||
|
||||
|
|
@ -37,23 +37,23 @@ O prim_list(In *in, O args, O env) { return interp_eval_list(in, args, env); }
|
|||
|
||||
O prim_head(In *in, O args, O env) {
|
||||
args = interp_eval_list(in, args, env);
|
||||
return pair_unwrap(nextarg(&args))->head;
|
||||
return pair_unwrap(in, nextarg(in, &args))->head;
|
||||
}
|
||||
|
||||
O prim_tail(In *in, O args, O env) {
|
||||
args = interp_eval_list(in, args, env);
|
||||
return pair_unwrap(nextarg(&args))->tail;
|
||||
return pair_unwrap(in, nextarg(in, &args))->tail;
|
||||
}
|
||||
|
||||
O prim_print(In *in, O args, O env) {
|
||||
args = interp_eval_list(in, args, env);
|
||||
print(nextarg(&args));
|
||||
print(nextarg(in, &args));
|
||||
return NIL;
|
||||
}
|
||||
|
||||
O prim_println(In *in, O args, O env) {
|
||||
args = interp_eval_list(in, args, env);
|
||||
O arg = nextarg(&args);
|
||||
O arg = nextarg(in, &args);
|
||||
println(arg);
|
||||
return NIL;
|
||||
}
|
||||
|
|
@ -61,13 +61,13 @@ O prim_println(In *in, O args, O env) {
|
|||
O prim_quote(In *in, O args, O env) {
|
||||
(void)in;
|
||||
(void)env;
|
||||
return nextarg(&args);
|
||||
return nextarg(in, &args);
|
||||
}
|
||||
|
||||
O prim_if(In *in, O args, O env) {
|
||||
O cond_expr = nextarg(&args);
|
||||
O then_expr = nextarg(&args);
|
||||
O else_expr = nextarg(&args);
|
||||
O cond_expr = nextarg(in, &args);
|
||||
O then_expr = nextarg(in, &args);
|
||||
O else_expr = nextarg(in, &args);
|
||||
|
||||
if (cond_expr == NIL || then_expr == NIL) {
|
||||
fprintf(stderr, "if: expected at least 2 arguments\n");
|
||||
|
|
@ -83,20 +83,20 @@ O prim_if(In *in, O args, O env) {
|
|||
|
||||
O prim_progn(In *in, O args, O env) {
|
||||
O result = NIL;
|
||||
for (O expr = nextarg(&args); expr != NIL; expr = nextarg(&args))
|
||||
for (O expr = nextarg(in, &args); expr != NIL; expr = nextarg(in, &args))
|
||||
result = interp_eval(in, expr, env);
|
||||
return result;
|
||||
}
|
||||
|
||||
O prim_add(In *in, O args, O env) {
|
||||
args = interp_eval_list(in, args, env);
|
||||
I result = nextarg(&args);
|
||||
I result = nextarg(in, &args);
|
||||
if (result == NIL) {
|
||||
return NUM(0);
|
||||
} else {
|
||||
result = ORD(result);
|
||||
}
|
||||
for (O arg = nextarg(&args); arg != NIL; arg = nextarg(&args)) {
|
||||
for (O arg = nextarg(in, &args); arg != NIL; arg = nextarg(in, &args)) {
|
||||
if (!IMM(arg)) {
|
||||
error_throw(in, "+: non numeric argument");
|
||||
}
|
||||
|
|
@ -107,13 +107,13 @@ O prim_add(In *in, O args, O env) {
|
|||
|
||||
O prim_sub(In *in, O args, O env) {
|
||||
args = interp_eval_list(in, args, env);
|
||||
I result = nextarg(&args);
|
||||
I result = nextarg(in, &args);
|
||||
if (result == NIL) {
|
||||
return NUM(0);
|
||||
} else {
|
||||
result = ORD(result);
|
||||
}
|
||||
for (O arg = nextarg(&args); arg != NIL; arg = nextarg(&args)) {
|
||||
for (O arg = nextarg(in, &args); arg != NIL; arg = nextarg(in, &args)) {
|
||||
if (!IMM(arg)) {
|
||||
error_throw(in, "-: non numeric argument");
|
||||
}
|
||||
|
|
@ -124,13 +124,13 @@ O prim_sub(In *in, O args, O env) {
|
|||
|
||||
O prim_mul(In *in, O args, O env) {
|
||||
args = interp_eval_list(in, args, env);
|
||||
I result = nextarg(&args);
|
||||
I result = nextarg(in, &args);
|
||||
if (result == NIL) {
|
||||
return NUM(1);
|
||||
} else {
|
||||
result = ORD(result);
|
||||
}
|
||||
for (O arg = nextarg(&args); arg != NIL; arg = nextarg(&args)) {
|
||||
for (O arg = nextarg(in, &args); arg != NIL; arg = nextarg(in, &args)) {
|
||||
if (!IMM(arg)) {
|
||||
error_throw(in, "*: non numeric argument");
|
||||
}
|
||||
|
|
@ -141,13 +141,13 @@ O prim_mul(In *in, O args, O env) {
|
|||
|
||||
O prim_div(In *in, O args, O env) {
|
||||
args = interp_eval_list(in, args, env);
|
||||
I result = nextarg(&args);
|
||||
I result = nextarg(in, &args);
|
||||
if (result == NIL) {
|
||||
return NUM(1);
|
||||
} else {
|
||||
result = ORD(result);
|
||||
}
|
||||
for (O arg = nextarg(&args); arg != NIL; arg = nextarg(&args)) {
|
||||
for (O arg = nextarg(in, &args); arg != NIL; arg = nextarg(in, &args)) {
|
||||
if (!IMM(arg)) {
|
||||
error_throw(in, "/: non numeric argument");
|
||||
}
|
||||
|
|
@ -163,8 +163,8 @@ O prim_equal(In *in, O args, O env) {
|
|||
args = interp_eval_list(in, args, env);
|
||||
I result = NIL;
|
||||
|
||||
O fst = nextarg(&args);
|
||||
for (O next = nextarg(&args); next != NIL; next = nextarg(&args)) {
|
||||
O fst = nextarg(in, &args);
|
||||
for (O next = nextarg(in, &args); next != NIL; next = nextarg(in, &args)) {
|
||||
if (fst == next) {
|
||||
result = in->t;
|
||||
} else {
|
||||
|
|
@ -177,8 +177,8 @@ O prim_equal(In *in, O args, O env) {
|
|||
|
||||
O prim_lt(In *in, O args, O env) {
|
||||
args = interp_eval_list(in, args, env);
|
||||
O fst = nextarg(&args);
|
||||
O snd = nextarg(&args);
|
||||
O fst = nextarg(in, &args);
|
||||
O snd = nextarg(in, &args);
|
||||
if (IMM(fst) && IMM(snd)) {
|
||||
return bool(in, ORD(fst) < ORD(snd));
|
||||
} else {
|
||||
|
|
@ -189,8 +189,8 @@ O prim_lt(In *in, O args, O env) {
|
|||
|
||||
O prim_gt(In *in, O args, O env) {
|
||||
args = interp_eval_list(in, args, env);
|
||||
O fst = nextarg(&args);
|
||||
O snd = nextarg(&args);
|
||||
O fst = nextarg(in, &args);
|
||||
O snd = nextarg(in, &args);
|
||||
if (IMM(fst) && IMM(snd)) {
|
||||
return bool(in, ORD(fst) > ORD(snd));
|
||||
} else {
|
||||
|
|
@ -200,7 +200,7 @@ O prim_gt(In *in, O args, O env) {
|
|||
}
|
||||
|
||||
O prim_fn(In *in, O args, O env) {
|
||||
O params = nextarg(&args);
|
||||
O params = nextarg(in, &args);
|
||||
O body = args;
|
||||
|
||||
I mark = gc_rootmark(&in->gc);
|
||||
|
|
@ -224,7 +224,7 @@ O prim_fn(In *in, O args, O env) {
|
|||
}
|
||||
|
||||
O prim_mac(In *in, O args, O env) {
|
||||
O params = nextarg(&args);
|
||||
O params = nextarg(in, &args);
|
||||
O body = args;
|
||||
|
||||
I mark = gc_rootmark(&in->gc);
|
||||
|
|
@ -256,8 +256,8 @@ O prim_gc(In *in, O args, O env) {
|
|||
}
|
||||
|
||||
O prim_def(In *in, O args, O env) {
|
||||
O sym = nextarg(&args);
|
||||
O val_expr = nextarg(&args);
|
||||
O sym = nextarg(in, &args);
|
||||
O val_expr = nextarg(in, &args);
|
||||
|
||||
if (type(sym) != TYPE_SYM) {
|
||||
error_throw(in, "def: expected symbol");
|
||||
|
|
@ -280,8 +280,8 @@ O prim_def(In *in, O args, O env) {
|
|||
}
|
||||
|
||||
O prim_defn(In *in, O args, O env) {
|
||||
O sym = nextarg(&args);
|
||||
O params = nextarg(&args);
|
||||
O sym = nextarg(in, &args);
|
||||
O params = nextarg(in, &args);
|
||||
O body = args;
|
||||
|
||||
if (type(sym) != TYPE_SYM) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue