#ifndef BDL_OBJECTS_H #define BDL_OBJECTS_H #include "string_view.h" #include "darray.h" #include "chunk.h" typedef enum ObjectType { OBJ_TYPE_NIL, OBJ_TYPE_TRUE, OBJ_TYPE_FALSE, OBJ_TYPE_FIXNUM, OBJ_TYPE_SYMBOL, OBJ_TYPE_STRING, OBJ_TYPE_PAIR, OBJ_TYPE_LAMBDA, OBJ_TYPE_ERR, } ObjectType; typedef struct Object { ObjectType type; bool marked; union { // OBJ_TYPE_FIXNUM ssize_t fixnum; // OBJ_TYPE_STRING // OBJ_TYPE_SYMBOL char *text; // OBJ_TYPE_PAIR // struct { // struct Object *car; // struct Object *cdr; // }; // OBJ_TYPE_LAMBDA Chunk *chunk; // struct { // struct Object *params; // struct Object *body; // struct Environment *env; // }; }; } Object; Object make_string(StringView sv); Object make_symbol(StringView sv); Object make_lambda(StringView name); void object_display(Object obj); void object_free(Object obj); bool object_equal(Object a, Object b); Object object_copy(Object src); // Value initialization. #define NIL_VAL ((Object){.type = OBJ_TYPE_NIL}) #define TRUE_VAL ((Object){.type = OBJ_TYPE_TRUE}) #define FALSE_VAL ((Object){.type = OBJ_TYPE_FALSE}) #define FIXNUM_VAL(VAL) ((Object){.type = OBJ_TYPE_FIXNUM, .fixnum = VAL}) #define BOOL_VAL(VAL) ((VAL) ? TRUE_VAL : FALSE_VAL) // Value extraction. #define AS_FIXNUM(VAL) ((VAL).fixnum) // Type checking. #define IS_NIL(VAL) ((VAL).type == OBJ_TYPE_NIL) #define IS_TRUE(VAL) ((VAL).type != OBJ_TYPE_FALSE) #define IS_FALSE(VAL) ((VAL).type == OBJ_TYPE_FALSE) #define IS_FIXNUM(VAL) ((VAL).type == OBJ_TYPE_FIXNUM) #define IS_STRING(VAL) ((VAL).type == OBJ_TYPE_STRING) #define IS_SYMBOL(VAL) ((VAL).type == OBJ_TYPE_SYMBOL) #define IS_LAMBDA(VAL) ((VAL).type == OBJ_TYPE_LAMBDA) #endif // BDL_OBJECTS_H