From 8f0c21094bc69a9adbebc42a4fc4744ed0501428 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sun, 10 Oct 2021 13:43:05 +0200 Subject: Add if primitive procedure --- src/bootstrap/main.c | 1 + src/bootstrap/primitives.c | 23 ++++++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) (limited to 'src/bootstrap') 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) { environment[env_n++] = (EnvSymbol){MAKE_SYM("not"), make_procedure(proc_not)}; environment[env_n++] = (EnvSymbol){MAKE_SYM("and"), make_procedure(proc_and)}; environment[env_n++] = (EnvSymbol){MAKE_SYM("or"), make_procedure(proc_or)}; + environment[env_n++] = (EnvSymbol){MAKE_SYM("if"), make_procedure(proc_if)}; environment[env_n++] = (EnvSymbol){MAKE_SYM("display"), make_procedure(proc_display)}; environment[env_n++] = (EnvSymbol){MAKE_SYM("print"), make_procedure(proc_print)}; } 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) { return obj_false; } -// TODO: if/cond +Object * +proc_if(Object *args) { + if (args->type != OBJ_TYPE_PAIR || args->cdr->type != OBJ_TYPE_PAIR) { + fprintf(stderr, "error: wrong number of arguments.\n"); + return NULL; + } + + Object *condition = eval(args->car); + if (condition == obj_true) { + Object *ret = eval(args->cdr->car); + return ret; + } + if (args->cdr->cdr != obj_nil) { + Object *ret = eval(args->cdr->cdr->car); + return ret; + } + + return obj_nil; +} + +// TODO: cond +// TODO: equality greater than smaller than... // TODO: fixnum left/right shift, mask, invert -- cgit v1.2.1