#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 Object; typedef struct Closure { // Non-owning reference to a chunk. Chunk *chunk; // Captured values for this closure. Object *values; } Closure; // typdef struct ConsCell { // struct Object *car; // struct Object *cdr; // } ConsCell; 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 // ConsCell *cons_cell; // OBJ_TYPE_LAMBDA Closure *closure; }; } Object; Object make_string(StringView sv); Object make_symbol(StringView sv); Object make_lambda(Chunk *chunk); 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