From 581116c655df4eb753098e013dd5854df95f7865 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sun, 10 Oct 2021 18:41:31 +0200 Subject: Add type introspection functions and tests --- src/bootstrap/primitives.c | 57 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 17 deletions(-) (limited to 'src/bootstrap') diff --git a/src/bootstrap/primitives.c b/src/bootstrap/primitives.c index 6300067..806656e 100644 --- a/src/bootstrap/primitives.c +++ b/src/bootstrap/primitives.c @@ -300,49 +300,72 @@ proc_print(Object *args) { Object * proc_is_boolean(Object *args) { - Object *obj = NULL; - if (args->type == OBJ_TYPE_PAIR) { - obj = eval(args->car); - } else { - obj = eval(args); + if (args->type != OBJ_TYPE_PAIR) { + fprintf(stderr, "error: wrong number of arguments.\n"); + return NULL; } + Object *obj = eval(args->car); return (obj == obj_true || obj == obj_false) ? obj_true : obj_false; } Object * proc_is_null(Object *args) { - // TODO: stub - return NULL; + if (args->type != OBJ_TYPE_PAIR) { + fprintf(stderr, "error: wrong number of arguments.\n"); + return NULL; + } + Object *obj = eval(args->car); + return obj == obj_nil ? obj_true : obj_false; } Object * proc_is_symbol(Object *args) { - // TODO: stub - return NULL; + if (args->type != OBJ_TYPE_PAIR) { + fprintf(stderr, "error: wrong number of arguments.\n"); + return NULL; + } + Object *obj = eval(args->car); + return obj->type == OBJ_TYPE_SYMBOL ? obj_true : obj_false; } Object * proc_is_string(Object *args) { - // TODO: stub - return NULL; + if (args->type != OBJ_TYPE_PAIR) { + fprintf(stderr, "error: wrong number of arguments.\n"); + return NULL; + } + Object *obj = eval(args->car); + return obj->type == OBJ_TYPE_STRING ? obj_true : obj_false; } Object * proc_is_fixnum(Object *args) { - // TODO: stub - return NULL; + if (args->type != OBJ_TYPE_PAIR) { + fprintf(stderr, "error: wrong number of arguments.\n"); + return NULL; + } + Object *obj = eval(args->car); + return obj->type == OBJ_TYPE_FIXNUM ? obj_true : obj_false; } Object * proc_is_pair(Object *args) { - // TODO: stub - return NULL; + if (args->type != OBJ_TYPE_PAIR) { + fprintf(stderr, "error: wrong number of arguments.\n"); + return NULL; + } + Object *obj = eval(args->car); + return obj->type == OBJ_TYPE_PAIR ? obj_true : obj_false; } Object * proc_is_procedure(Object *args) { - // TODO: stub - return NULL; + if (args->type != OBJ_TYPE_PAIR) { + fprintf(stderr, "error: wrong number of arguments.\n"); + return NULL; + } + Object *obj = eval(args->car); + return obj->type == OBJ_TYPE_PROCEDURE ? obj_true : obj_false; } // -- cgit v1.2.1