From e2c284b57641b5feec9a8d04313b0cd6d556e860 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sun, 24 Oct 2021 18:26:42 +0200 Subject: Add lambda type and minor file cleanup --- src/bytecode/objects.c | 126 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 src/bytecode/objects.c (limited to 'src/bytecode/objects.c') diff --git a/src/bytecode/objects.c b/src/bytecode/objects.c new file mode 100644 index 0000000..515a19d --- /dev/null +++ b/src/bytecode/objects.c @@ -0,0 +1,126 @@ +#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(void) { + Object obj = { + .type = OBJ_TYPE_LAMBDA, + .chunk = chunk_init(), + }; + 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}"); + } 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; + 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; + default: { break; } break; + } + return src; +} -- cgit v1.2.1