From 9323c1285a8a9f7ec33e88d26f102d92c7a6e2ec Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sun, 10 Oct 2021 14:15:45 +0200 Subject: Add cond special form --- src/bootstrap/primitives.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) (limited to 'src/bootstrap/primitives.c') 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) { return obj_nil; } -// TODO: cond +Object * +proc_cond(Object *args) { + if (args->type != OBJ_TYPE_PAIR) { + fprintf(stderr, "error: wrong number of arguments.\n"); + return NULL; + } + + if (args->car->type != OBJ_TYPE_PAIR) { + fprintf(stderr, "error: wrong argument type.\n"); + return NULL; + } + + while (args != obj_nil) { + Object *clause = args->car; + if (eval(clause->car) == obj_true) { + return eval(clause->cdr->car); + } + + args = args->cdr; + clause = args->car; + } + + return obj_nil; +} + // TODO: equality greater than smaller than... // TODO: fixnum left/right shift, mask, invert -- cgit v1.2.1