aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-10 14:15:45 +0200
committerBad Diode <bd@badd10de.dev>2021-10-10 14:15:45 +0200
commit9323c1285a8a9f7ec33e88d26f102d92c7a6e2ec (patch)
treecfdc7470c4aa088ce77f92f6fff5c3683f92835a /src
parent8f0c21094bc69a9adbebc42a4fc4744ed0501428 (diff)
downloadbdl-9323c1285a8a9f7ec33e88d26f102d92c7a6e2ec.tar.gz
bdl-9323c1285a8a9f7ec33e88d26f102d92c7a6e2ec.zip
Add cond special form
Diffstat (limited to 'src')
-rwxr-xr-xsrc/bootstrap/main.c2
-rw-r--r--src/bootstrap/primitives.c26
2 files changed, 27 insertions, 1 deletions
diff --git a/src/bootstrap/main.c b/src/bootstrap/main.c
index 8ec1231..c0f2e50 100755
--- a/src/bootstrap/main.c
+++ b/src/bootstrap/main.c
@@ -41,6 +41,8 @@ init(void) {
41 environment[env_n++] = (EnvSymbol){MAKE_SYM("and"), make_procedure(proc_and)}; 41 environment[env_n++] = (EnvSymbol){MAKE_SYM("and"), make_procedure(proc_and)};
42 environment[env_n++] = (EnvSymbol){MAKE_SYM("or"), make_procedure(proc_or)}; 42 environment[env_n++] = (EnvSymbol){MAKE_SYM("or"), make_procedure(proc_or)};
43 environment[env_n++] = (EnvSymbol){MAKE_SYM("if"), make_procedure(proc_if)}; 43 environment[env_n++] = (EnvSymbol){MAKE_SYM("if"), make_procedure(proc_if)};
44 environment[env_n++] = (EnvSymbol){MAKE_SYM("else"), obj_true};
45 environment[env_n++] = (EnvSymbol){MAKE_SYM("cond"), make_procedure(proc_cond)};
44 environment[env_n++] = (EnvSymbol){MAKE_SYM("display"), make_procedure(proc_display)}; 46 environment[env_n++] = (EnvSymbol){MAKE_SYM("display"), make_procedure(proc_display)};
45 environment[env_n++] = (EnvSymbol){MAKE_SYM("print"), make_procedure(proc_print)}; 47 environment[env_n++] = (EnvSymbol){MAKE_SYM("print"), make_procedure(proc_print)};
46} 48}
diff --git a/src/bootstrap/primitives.c b/src/bootstrap/primitives.c
index 61ce360..29a1df8 100644
--- a/src/bootstrap/primitives.c
+++ b/src/bootstrap/primitives.c
@@ -329,6 +329,30 @@ proc_if(Object *args) {
329 return obj_nil; 329 return obj_nil;
330} 330}
331 331
332// TODO: cond 332Object *
333proc_cond(Object *args) {
334 if (args->type != OBJ_TYPE_PAIR) {
335 fprintf(stderr, "error: wrong number of arguments.\n");
336 return NULL;
337 }
338
339 if (args->car->type != OBJ_TYPE_PAIR) {
340 fprintf(stderr, "error: wrong argument type.\n");
341 return NULL;
342 }
343
344 while (args != obj_nil) {
345 Object *clause = args->car;
346 if (eval(clause->car) == obj_true) {
347 return eval(clause->cdr->car);
348 }
349
350 args = args->cdr;
351 clause = args->car;
352 }
353
354 return obj_nil;
355}
356
333// TODO: equality greater than smaller than... 357// TODO: equality greater than smaller than...
334// TODO: fixnum left/right shift, mask, invert 358// TODO: fixnum left/right shift, mask, invert