diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/bootstrap/main.c | 1 | ||||
-rw-r--r-- | src/bootstrap/primitives.c | 23 |
2 files changed, 23 insertions, 1 deletions
diff --git a/src/bootstrap/main.c b/src/bootstrap/main.c index a8ba7bc..8ec1231 100755 --- a/src/bootstrap/main.c +++ b/src/bootstrap/main.c | |||
@@ -40,6 +40,7 @@ init(void) { | |||
40 | environment[env_n++] = (EnvSymbol){MAKE_SYM("not"), make_procedure(proc_not)}; | 40 | environment[env_n++] = (EnvSymbol){MAKE_SYM("not"), make_procedure(proc_not)}; |
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("display"), make_procedure(proc_display)}; | 44 | environment[env_n++] = (EnvSymbol){MAKE_SYM("display"), make_procedure(proc_display)}; |
44 | environment[env_n++] = (EnvSymbol){MAKE_SYM("print"), make_procedure(proc_print)}; | 45 | environment[env_n++] = (EnvSymbol){MAKE_SYM("print"), make_procedure(proc_print)}; |
45 | } | 46 | } |
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 |