#include "objects.h" Object make_string(StringView sv) { Object obj = { .type = OBJ_TYPE_STRING, .text = NULL, }; array_init(obj.text, sv.n); array_insert(obj.text, sv.start, sv.n); return obj; } Object make_symbol(StringView sv) { Object obj = { .type = OBJ_TYPE_SYMBOL, .text = NULL, }; array_init(obj.text, sv.n); array_insert(obj.text, sv.start, sv.n); return obj; } Object make_lambda(StringView name) { Object obj = { .type = OBJ_TYPE_LAMBDA, .chunk = chunk_init(name), }; return obj; } void object_display(Object obj) { switch (obj.type) { case OBJ_TYPE_FIXNUM: { printf("%zd", obj.fixnum); } break; case OBJ_TYPE_TRUE: { printf("true"); } break; case OBJ_TYPE_FALSE: { printf("false"); } break; case OBJ_TYPE_NIL: { printf("()"); } break; case OBJ_TYPE_STRING: { printf("\"%.*s\"", (int)array_size(obj.text), obj.text); } break; case OBJ_TYPE_SYMBOL: { printf(":%.*s", (int)array_size(obj.text), obj.text); } break; case OBJ_TYPE_PAIR: { // printf("("); // display_pair(obj); // printf(")"); } break; case OBJ_TYPE_LAMBDA: { printf("#{procedure:%.*s}", (int)array_size(obj.chunk->name), obj.chunk->name); } break; case OBJ_TYPE_ERR: { printf("#{error}"); } break; } return; } void object_free(Object obj) { if (IS_STRING(obj) || IS_SYMBOL(obj)) { array_free(obj.text); return; } if (IS_LAMBDA(obj)) { chunk_free(obj.chunk); } } bool object_equal(Object a, Object b) { if (a.type != b.type) { return false; } switch (a.type) { case OBJ_TYPE_TRUE: case OBJ_TYPE_FALSE: { return true; } break; case OBJ_TYPE_FIXNUM: { return a.fixnum == b.fixnum; } break; case OBJ_TYPE_SYMBOL: case OBJ_TYPE_STRING: { if (array_size(a.text) != array_size(b.text)) { return false; } for (size_t i = 0; i < array_size(a.text); i++) { if (a.text[i] != b.text[i]) { return false; } } } break; case OBJ_TYPE_LAMBDA: { return a.chunk == b.chunk; } break; default: { return false; } break; } return true; } Object object_copy(Object src) { switch (src.type) { case OBJ_TYPE_SYMBOL: case OBJ_TYPE_STRING: { Object copy = src; copy.text = NULL; array_init(copy.text, array_size(src.text)); array_insert(copy.text, src.text, array_size(src.text)); return copy; } break; case OBJ_TYPE_LAMBDA: { // Object copy = src; // StringView name = (StringView){ // .start = src.chunk->name, // .n = array_size(src.chunk->name), // }; // // TODO: copy full chunk? // // copy.chunk = chunk_init(name); // return copy; } break; default: { break; } break; } return src; }