diff options
Diffstat (limited to 'src/bootstrap')
-rwxr-xr-x | src/bootstrap/main.c | 2 | ||||
-rw-r--r-- | src/bootstrap/primitives.c | 26 |
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 | 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 |