diff options
author | Bad Diode <bd@badd10de.dev> | 2021-10-10 18:41:31 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-10-10 18:41:31 +0200 |
commit | 581116c655df4eb753098e013dd5854df95f7865 (patch) | |
tree | 5439c196d27ef7d6fe93f96b006f2cca24d8170f /src | |
parent | 43861f9d91782d864dc9866eee1d39288bb3a76d (diff) | |
download | bdl-581116c655df4eb753098e013dd5854df95f7865.tar.gz bdl-581116c655df4eb753098e013dd5854df95f7865.zip |
Add type introspection functions and tests
Diffstat (limited to 'src')
-rw-r--r-- | src/bootstrap/primitives.c | 57 |
1 files changed, 40 insertions, 17 deletions
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) { | |||
300 | 300 | ||
301 | Object * | 301 | Object * |
302 | proc_is_boolean(Object *args) { | 302 | proc_is_boolean(Object *args) { |
303 | Object *obj = NULL; | 303 | if (args->type != OBJ_TYPE_PAIR) { |
304 | if (args->type == OBJ_TYPE_PAIR) { | 304 | fprintf(stderr, "error: wrong number of arguments.\n"); |
305 | obj = eval(args->car); | 305 | return NULL; |
306 | } else { | ||
307 | obj = eval(args); | ||
308 | } | 306 | } |
307 | Object *obj = eval(args->car); | ||
309 | return (obj == obj_true || obj == obj_false) ? obj_true : obj_false; | 308 | return (obj == obj_true || obj == obj_false) ? obj_true : obj_false; |
310 | } | 309 | } |
311 | 310 | ||
312 | Object * | 311 | Object * |
313 | proc_is_null(Object *args) { | 312 | proc_is_null(Object *args) { |
314 | // TODO: stub | 313 | if (args->type != OBJ_TYPE_PAIR) { |
315 | return NULL; | 314 | fprintf(stderr, "error: wrong number of arguments.\n"); |
315 | return NULL; | ||
316 | } | ||
317 | Object *obj = eval(args->car); | ||
318 | return obj == obj_nil ? obj_true : obj_false; | ||
316 | } | 319 | } |
317 | 320 | ||
318 | Object * | 321 | Object * |
319 | proc_is_symbol(Object *args) { | 322 | proc_is_symbol(Object *args) { |
320 | // TODO: stub | 323 | if (args->type != OBJ_TYPE_PAIR) { |
321 | return NULL; | 324 | fprintf(stderr, "error: wrong number of arguments.\n"); |
325 | return NULL; | ||
326 | } | ||
327 | Object *obj = eval(args->car); | ||
328 | return obj->type == OBJ_TYPE_SYMBOL ? obj_true : obj_false; | ||
322 | } | 329 | } |
323 | 330 | ||
324 | Object * | 331 | Object * |
325 | proc_is_string(Object *args) { | 332 | proc_is_string(Object *args) { |
326 | // TODO: stub | 333 | if (args->type != OBJ_TYPE_PAIR) { |
327 | return NULL; | 334 | fprintf(stderr, "error: wrong number of arguments.\n"); |
335 | return NULL; | ||
336 | } | ||
337 | Object *obj = eval(args->car); | ||
338 | return obj->type == OBJ_TYPE_STRING ? obj_true : obj_false; | ||
328 | } | 339 | } |
329 | 340 | ||
330 | Object * | 341 | Object * |
331 | proc_is_fixnum(Object *args) { | 342 | proc_is_fixnum(Object *args) { |
332 | // TODO: stub | 343 | if (args->type != OBJ_TYPE_PAIR) { |
333 | return NULL; | 344 | fprintf(stderr, "error: wrong number of arguments.\n"); |
345 | return NULL; | ||
346 | } | ||
347 | Object *obj = eval(args->car); | ||
348 | return obj->type == OBJ_TYPE_FIXNUM ? obj_true : obj_false; | ||
334 | } | 349 | } |
335 | 350 | ||
336 | Object * | 351 | Object * |
337 | proc_is_pair(Object *args) { | 352 | proc_is_pair(Object *args) { |
338 | // TODO: stub | 353 | if (args->type != OBJ_TYPE_PAIR) { |
339 | return NULL; | 354 | fprintf(stderr, "error: wrong number of arguments.\n"); |
355 | return NULL; | ||
356 | } | ||
357 | Object *obj = eval(args->car); | ||
358 | return obj->type == OBJ_TYPE_PAIR ? obj_true : obj_false; | ||
340 | } | 359 | } |
341 | 360 | ||
342 | Object * | 361 | Object * |
343 | proc_is_procedure(Object *args) { | 362 | proc_is_procedure(Object *args) { |
344 | // TODO: stub | 363 | if (args->type != OBJ_TYPE_PAIR) { |
345 | return NULL; | 364 | fprintf(stderr, "error: wrong number of arguments.\n"); |
365 | return NULL; | ||
366 | } | ||
367 | Object *obj = eval(args->car); | ||
368 | return obj->type == OBJ_TYPE_PROCEDURE ? obj_true : obj_false; | ||
346 | } | 369 | } |
347 | 370 | ||
348 | // | 371 | // |