From c2bfb5368e603d686190fdc9f3ddbafbda075a9c Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sat, 9 Oct 2021 21:21:32 +0200 Subject: Add some boolean procedures --- src/bootstrap/main.c | 12 +++++++----- src/bootstrap/objects.c | 10 ++++++++++ src/bootstrap/primitives.c | 13 +++++++++++++ 3 files changed, 30 insertions(+), 5 deletions(-) (limited to 'src/bootstrap') diff --git a/src/bootstrap/main.c b/src/bootstrap/main.c index e5d9b17..95b2e49 100755 --- a/src/bootstrap/main.c +++ b/src/bootstrap/main.c @@ -32,11 +32,13 @@ init(void) { obj_false = make_boolean(false); // Add primitive functions. - environment[env_n++] = (EnvSymbol){make_symbol("+", 1), make_procedure(proc_add)}; - environment[env_n++] = (EnvSymbol){make_symbol("-", 1), make_procedure(proc_sub)}; - environment[env_n++] = (EnvSymbol){make_symbol("*", 1), make_procedure(proc_mul)}; - environment[env_n++] = (EnvSymbol){make_symbol("/", 1), make_procedure(proc_div)}; - environment[env_n++] = (EnvSymbol){make_symbol("display", 7), make_procedure(proc_display)}; + environment[env_n++] = (EnvSymbol){MAKE_SYM("+"), make_procedure(proc_add)}; + environment[env_n++] = (EnvSymbol){MAKE_SYM("-"), make_procedure(proc_sub)}; + environment[env_n++] = (EnvSymbol){MAKE_SYM("*"), make_procedure(proc_mul)}; + environment[env_n++] = (EnvSymbol){MAKE_SYM("/"), make_procedure(proc_div)}; + environment[env_n++] = (EnvSymbol){MAKE_SYM("boolean?"), make_procedure(proc_is_boolean)}; + environment[env_n++] = (EnvSymbol){MAKE_SYM("false?"), make_procedure(proc_is_false)}; + environment[env_n++] = (EnvSymbol){MAKE_SYM("display"), make_procedure(proc_display)}; } void diff --git a/src/bootstrap/objects.c b/src/bootstrap/objects.c index 14ff50d..344cae9 100644 --- a/src/bootstrap/objects.c +++ b/src/bootstrap/objects.c @@ -125,6 +125,10 @@ make_pair(Object *car, Object *cdr) { return obj; } +// +// Comparative ops. +// + bool symbol_eq(Object *a, Object *b) { if (a->type != b->type || a->type != OBJ_TYPE_SYMBOL || a->symbol_n != b->symbol_n) { @@ -137,3 +141,9 @@ symbol_eq(Object *a, Object *b) { } return true; } + +// +// Utility macros. +// + +#define MAKE_SYM(SYM) make_symbol((SYM), sizeof(SYM) - 1) diff --git a/src/bootstrap/primitives.c b/src/bootstrap/primitives.c index f72e484..e4c18cd 100644 --- a/src/bootstrap/primitives.c +++ b/src/bootstrap/primitives.c @@ -221,3 +221,16 @@ proc_display(Object *args) { } return obj_nil; } + +Object * +proc_is_boolean(Object *args) { + if (args->car == obj_true || args->car == obj_false) { + return obj_true; + } + return obj_false; +} + +Object * +proc_is_false(Object *args) { + return args->car == obj_false ? obj_true : obj_false; +} -- cgit v1.2.1