From 13f795f8f8aa302ee36ca3974fb80dba29240240 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sat, 23 Oct 2021 15:32:40 +0200 Subject: Add more types and access macros --- src/bytecode/objects.h | 81 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 76 insertions(+), 5 deletions(-) (limited to 'src/bytecode/objects.h') diff --git a/src/bytecode/objects.h b/src/bytecode/objects.h index 9bfa2cf..a25b0b1 100755 --- a/src/bytecode/objects.h +++ b/src/bytecode/objects.h @@ -2,26 +2,97 @@ #define BDL_OBJECTS_H typedef enum ObjectType { - OBJ_TYPE_FIXNUM, - OBJ_TYPE_BOOL, OBJ_TYPE_NIL, + OBJ_TYPE_TRUE, + OBJ_TYPE_FALSE, + OBJ_TYPE_FIXNUM, OBJ_TYPE_SYMBOL, OBJ_TYPE_STRING, OBJ_TYPE_PAIR, - OBJ_TYPE_PROCEDURE, OBJ_TYPE_LAMBDA, OBJ_TYPE_ERR, } ObjectType; struct Environment; -typedef s64 Object; +typedef struct Object { + ObjectType type; + bool marked; + union { + // OBJ_TYPE_FIXNUM + ssize_t fixnum; + + // OBJ_TYPE_STRING + // OBJ_TYPE_SYMBOL + // struct { + // char *text; + // }; + + // OBJ_TYPE_PAIR + // struct { + // struct Object *car; + // struct Object *cdr; + // }; + + // OBJ_TYPE_LAMBDA + // struct { + // struct Object *params; + // struct Object *body; + // struct Environment *env; + // }; + }; +} Object; void display(Object obj); +// 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}) + +// Value extraction. +#define AS_FIXNUM(VAL) ((VAL).fixnum) + +// Type checking. +#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) + void display(Object obj) { - printf("%ld", 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.string), obj.string); + } break; + case OBJ_TYPE_SYMBOL: { + // printf(":%.*s", (int)array_size(obj.symbol), obj.symbol); + } 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; } #endif // BDL_OBJECTS_H -- cgit v1.2.1