diff options
Diffstat (limited to 'src/bootstrap/primitives.c')
-rw-r--r-- | src/bootstrap/primitives.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/src/bootstrap/primitives.c b/src/bootstrap/primitives.c index 97058f9..61ce360 100644 --- a/src/bootstrap/primitives.c +++ b/src/bootstrap/primitives.c | |||
@@ -309,5 +309,26 @@ proc_or(Object *args) { | |||
309 | return obj_false; | 309 | return obj_false; |
310 | } | 310 | } |
311 | 311 | ||
312 | // TODO: if/cond | 312 | Object * |
313 | proc_if(Object *args) { | ||
314 | if (args->type != OBJ_TYPE_PAIR || args->cdr->type != OBJ_TYPE_PAIR) { | ||
315 | fprintf(stderr, "error: wrong number of arguments.\n"); | ||
316 | return NULL; | ||
317 | } | ||
318 | |||
319 | Object *condition = eval(args->car); | ||
320 | if (condition == obj_true) { | ||
321 | Object *ret = eval(args->cdr->car); | ||
322 | return ret; | ||
323 | } | ||
324 | if (args->cdr->cdr != obj_nil) { | ||
325 | Object *ret = eval(args->cdr->cdr->car); | ||
326 | return ret; | ||
327 | } | ||
328 | |||
329 | return obj_nil; | ||
330 | } | ||
331 | |||
332 | // TODO: cond | ||
333 | // TODO: equality greater than smaller than... | ||
313 | // TODO: fixnum left/right shift, mask, invert | 334 | // TODO: fixnum left/right shift, mask, invert |