diff options
Diffstat (limited to 'src/bootstrap/primitives.c')
-rw-r--r-- | src/bootstrap/primitives.c | 26 |
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 | 332 | Object * |
333 | proc_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 |