diff options
author | Bad Diode <bd@badd10de.dev> | 2021-10-09 21:21:32 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-10-09 21:21:32 +0200 |
commit | c2bfb5368e603d686190fdc9f3ddbafbda075a9c (patch) | |
tree | 8de0c13cf2d260906d9b56d15a6e19cc402c2a8a /src | |
parent | 2f3f7a4fbc6c77e3cf933ea01f584a28bc40936d (diff) | |
download | bdl-c2bfb5368e603d686190fdc9f3ddbafbda075a9c.tar.gz bdl-c2bfb5368e603d686190fdc9f3ddbafbda075a9c.zip |
Add some boolean procedures
Diffstat (limited to 'src')
-rwxr-xr-x | src/bootstrap/main.c | 12 | ||||
-rw-r--r-- | src/bootstrap/objects.c | 10 | ||||
-rw-r--r-- | src/bootstrap/primitives.c | 13 |
3 files changed, 30 insertions, 5 deletions
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 | ||
42 | void | 44 | 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) { | |||
125 | return obj; | 125 | return obj; |
126 | } | 126 | } |
127 | 127 | ||
128 | // | ||
129 | // Comparative ops. | ||
130 | // | ||
131 | |||
128 | bool | 132 | bool |
129 | symbol_eq(Object *a, Object *b) { | 133 | symbol_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 | |||
225 | Object * | ||
226 | proc_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 | |||
233 | Object * | ||
234 | proc_is_false(Object *args) { | ||
235 | return args->car == obj_false ? obj_true : obj_false; | ||
236 | } | ||