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.h | 124 +++++-------------------------------------------- 1 file changed, 12 insertions(+), 112 deletions(-) (limited to 'src/bytecode/objects.h') diff --git a/src/bytecode/objects.h b/src/bytecode/objects.h index 9744071..72f7420 100755 --- a/src/bytecode/objects.h +++ b/src/bytecode/objects.h @@ -3,6 +3,7 @@ #include "string_view.h" #include "darray.h" +#include "chunk.h" typedef enum ObjectType { OBJ_TYPE_NIL, @@ -16,8 +17,6 @@ typedef enum ObjectType { OBJ_TYPE_ERR, } ObjectType; -struct Environment; - typedef struct Object { ObjectType type; bool marked; @@ -38,6 +37,9 @@ typedef struct Object { // }; // OBJ_TYPE_LAMBDA + struct { + Chunk *chunk; + }; // struct { // struct Object *params; // struct Object *body; @@ -46,7 +48,13 @@ typedef struct Object { }; } Object; -void display(Object obj); +Object make_string(StringView sv); +Object make_symbol(StringView sv); +Object make_lambda(void); +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}) @@ -64,115 +72,7 @@ void display(Object obj); #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) -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; -} - -void -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); - } -} - -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; -} #endif // BDL_OBJECTS_H -- cgit v1.2.1