#ifndef BDL_OBJECTS_H #define BDL_OBJECTS_H #include "string_view.h" typedef enum ObjectType { OBJ_TYPE_FIXNUM, OBJ_TYPE_BOOL, OBJ_TYPE_NIL, OBJ_TYPE_SYMBOL, OBJ_TYPE_STRING, OBJ_TYPE_PAIR, OBJ_TYPE_PROCEDURE, OBJ_TYPE_LAMBDA, OBJ_TYPE_ERR, } ObjectType; struct Environment; typedef struct Object { ObjectType type; bool marked; union { // OBJ_TYPE_FIXNUM ssize_t fixnum; // OBJ_TYPE_STRING struct { char *string; }; // OBJ_TYPE_PAIR struct { struct Object *car; struct Object *cdr; }; // OBJ_TYPE_SYMBOL struct { char *symbol; }; // OBJ_TYPE_PROCEDURE struct Object *(*proc)(struct Environment *env, struct Object *args); // OBJ_TYPE_LAMBDA struct { struct Object *params; struct Object *body; struct Environment *env; }; }; } Object; // Object constructors. Object * make_fixnum(ssize_t num); Object * make_procedure(Object *(*proc)(struct Environment *, Object *args)); Object * make_pair(Object *car, Object *cdr); Object * make_symbol(StringView sv); Object * make_string(void); void append_string(Object *obj, const StringView sv); // Object representation. void display(Object *root); void display_pair(Object *root); // Object comparison. bool obj_eq(const Object *a, const Object* b); // Utility macros. #define DEBUG_OBJ(MSG,OBJ) printf((MSG)); display(OBJ); printf("\n"); #define PRINT_OBJ(OBJ) display(OBJ); printf("\n"); #define MAKE_SYM(STR) make_symbol((StringView){(STR), sizeof(STR) - 1}) #endif // BDL_OBJECTS_H