aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-10 13:43:05 +0200
committerBad Diode <bd@badd10de.dev>2021-10-10 13:43:05 +0200
commit8f0c21094bc69a9adbebc42a4fc4744ed0501428 (patch)
tree58a3fd5c4b29649a46dc45066011be4b00c1f46e /src
parent4673fde605090320fbab227e56bb085eec97362a (diff)
downloadbdl-8f0c21094bc69a9adbebc42a4fc4744ed0501428.tar.gz
bdl-8f0c21094bc69a9adbebc42a4fc4744ed0501428.zip
Add if primitive procedure
Diffstat (limited to 'src')
-rwxr-xr-xsrc/bootstrap/main.c1
-rw-r--r--src/bootstrap/primitives.c23
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 312Object *
313proc_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