aboutsummaryrefslogtreecommitdiffstats
path: root/src/bootstrap/primitives.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bootstrap/primitives.c')
-rw-r--r--src/bootstrap/primitives.c26
1 files changed, 25 insertions, 1 deletions
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