proper lexical scoping now woo
This commit is contained in:
parent
ce9489b5d2
commit
27df5f8ce0
13 changed files with 349 additions and 45 deletions
|
|
@ -70,7 +70,8 @@ O prim_write(In *in, O *args, int argc, O env) {
|
|||
if (argc != 1)
|
||||
error_throw(in, "write: expected 1 argument, got %d", argc);
|
||||
if (type(args[0]) != TYPE_STR)
|
||||
error_throw(in, "write: expected string argument, got %s", typename(type(args[0])));
|
||||
error_throw(in, "write: expected string argument, got %s",
|
||||
typename(type(args[0])));
|
||||
Ss *s = (Ss *)(UNBOX(args[0]) + 1);
|
||||
printf("%.*s", (int)s->len, s->data);
|
||||
return NIL;
|
||||
|
|
@ -132,6 +133,23 @@ O prim_div(In *in, O *args, int argc, O env) {
|
|||
return NUM(result);
|
||||
}
|
||||
|
||||
O prim_mod(In *in, O *args, int argc, O env) {
|
||||
(void)env;
|
||||
if (argc == 0)
|
||||
return NUM(1);
|
||||
if (!IMM(args[0]))
|
||||
error_throw(in, "/: non numeric argument at position 0");
|
||||
I result = ORD(args[0]);
|
||||
for (int i = 1; i < argc; i++) {
|
||||
if (!IMM(args[i]))
|
||||
error_throw(in, "/: non numeric argument at position %d", i);
|
||||
if (ORD(args[i]) == 0)
|
||||
error_throw(in, "/: division by zero at position %d", i);
|
||||
result %= ORD(args[i]);
|
||||
}
|
||||
return NUM(result);
|
||||
}
|
||||
|
||||
O prim_equal(In *in, O *args, int argc, O env) {
|
||||
(void)env;
|
||||
if (argc < 2)
|
||||
|
|
@ -168,6 +186,20 @@ O prim_gt(In *in, O *args, int argc, O env) {
|
|||
}
|
||||
}
|
||||
|
||||
O prim_nil_p(In *in, O *args, int argc, O env) {
|
||||
(void)env;
|
||||
if (argc != 1)
|
||||
error_throw(in, "nil?: expected 1 argument, got %d", argc);
|
||||
return BOOL(args[0] == NIL);
|
||||
}
|
||||
|
||||
O prim_env(In *in, O *args, int argc, O env) {
|
||||
(void)args;
|
||||
(void)argc;
|
||||
(void)env;
|
||||
return in->env;
|
||||
}
|
||||
|
||||
O prim_gc(In *in, O *args, int argc, O env) {
|
||||
(void)args;
|
||||
(void)argc;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue