aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-09 21:21:32 +0200
committerBad Diode <bd@badd10de.dev>2021-10-09 21:21:32 +0200
commitc2bfb5368e603d686190fdc9f3ddbafbda075a9c (patch)
tree8de0c13cf2d260906d9b56d15a6e19cc402c2a8a
parent2f3f7a4fbc6c77e3cf933ea01f584a28bc40936d (diff)
downloadbdl-c2bfb5368e603d686190fdc9f3ddbafbda075a9c.tar.gz
bdl-c2bfb5368e603d686190fdc9f3ddbafbda075a9c.zip
Add some boolean procedures
-rwxr-xr-xMakefile2
-rwxr-xr-xsrc/bootstrap/main.c12
-rw-r--r--src/bootstrap/objects.c10
-rw-r--r--src/bootstrap/primitives.c13
4 files changed, 31 insertions, 6 deletions
diff --git a/Makefile b/Makefile
index 1f7c8dd..afcd918 100755
--- a/Makefile
+++ b/Makefile
@@ -47,7 +47,7 @@ run: $(BIN)
47 ./$(BIN) -i 47 ./$(BIN) -i
48 48
49tests: $(BIN) 49tests: $(BIN)
50 ./$(BIN) examples/arithmetic.bdl | diff tests/arithmetic_expected.txt - 50 ./$(BIN) examples/arithmetic.bdl | diff -q tests/arithmetic_expected.txt -
51 51
52# Remove build directory. 52# Remove build directory.
53clean: 53clean:
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) {
32 obj_false = make_boolean(false); 32 obj_false = make_boolean(false);
33 33
34 // Add primitive functions. 34 // Add primitive functions.
35 environment[env_n++] = (EnvSymbol){make_symbol("+", 1), make_procedure(proc_add)}; 35 environment[env_n++] = (EnvSymbol){MAKE_SYM("+"), make_procedure(proc_add)};
36 environment[env_n++] = (EnvSymbol){make_symbol("-", 1), make_procedure(proc_sub)}; 36 environment[env_n++] = (EnvSymbol){MAKE_SYM("-"), make_procedure(proc_sub)};
37 environment[env_n++] = (EnvSymbol){make_symbol("*", 1), make_procedure(proc_mul)}; 37 environment[env_n++] = (EnvSymbol){MAKE_SYM("*"), make_procedure(proc_mul)};
38 environment[env_n++] = (EnvSymbol){make_symbol("/", 1), make_procedure(proc_div)}; 38 environment[env_n++] = (EnvSymbol){MAKE_SYM("/"), make_procedure(proc_div)};
39 environment[env_n++] = (EnvSymbol){make_symbol("display", 7), make_procedure(proc_display)}; 39 environment[env_n++] = (EnvSymbol){MAKE_SYM("boolean?"), make_procedure(proc_is_boolean)};
40 environment[env_n++] = (EnvSymbol){MAKE_SYM("false?"), make_procedure(proc_is_false)};
41 environment[env_n++] = (EnvSymbol){MAKE_SYM("display"), make_procedure(proc_display)};
40} 42}
41 43
42void 44void
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) {
125 return obj; 125 return obj;
126} 126}
127 127
128//
129// Comparative ops.
130//
131
128bool 132bool
129symbol_eq(Object *a, Object *b) { 133symbol_eq(Object *a, Object *b) {
130 if (a->type != b->type || a->type != OBJ_TYPE_SYMBOL || a->symbol_n != b->symbol_n) { 134 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) {
137 } 141 }
138 return true; 142 return true;
139} 143}
144
145//
146// Utility macros.
147//
148
149#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) {
221 } 221 }
222 return obj_nil; 222 return obj_nil;
223} 223}
224
225Object *
226proc_is_boolean(Object *args) {
227 if (args->car == obj_true || args->car == obj_false) {
228 return obj_true;
229 }
230 return obj_false;
231}
232
233Object *
234proc_is_false(Object *args) {
235 return args->car == obj_false ? obj_true : obj_false;
236}