From eeff5e273f22aa28e81ab080e9ffdce85ac394b8 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Fri, 22 Oct 2021 09:59:31 +0200 Subject: Prepare skeleton for bytecode interpreter --- src/treewalk/objects.h | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/treewalk/objects.h (limited to 'src/treewalk/objects.h') diff --git a/src/treewalk/objects.h b/src/treewalk/objects.h new file mode 100644 index 0000000..ed623eb --- /dev/null +++ b/src/treewalk/objects.h @@ -0,0 +1,75 @@ +#ifndef BDL_OBJECTS_H +#define BDL_OBJECTS_H + +#include "string_view.h" + +typedef enum ObjectType { + OBJ_TYPE_FIXNUM, + OBJ_TYPE_BOOL, + OBJ_TYPE_NIL, + OBJ_TYPE_SYMBOL, + OBJ_TYPE_STRING, + OBJ_TYPE_PAIR, + OBJ_TYPE_PROCEDURE, + OBJ_TYPE_LAMBDA, + OBJ_TYPE_ERR, +} ObjectType; + +struct Environment; + +typedef struct Object { + ObjectType type; + bool marked; + union { + // OBJ_TYPE_FIXNUM + ssize_t fixnum; + + // OBJ_TYPE_STRING + struct { + char *string; + }; + + // OBJ_TYPE_PAIR + struct { + struct Object *car; + struct Object *cdr; + }; + + // OBJ_TYPE_SYMBOL + struct { + char *symbol; + }; + + // OBJ_TYPE_PROCEDURE + struct Object *(*proc)(struct Environment *env, struct Object *args); + + // OBJ_TYPE_LAMBDA + struct { + struct Object *params; + struct Object *body; + struct Environment *env; + }; + }; +} Object; + +// Object constructors. +Object * make_fixnum(ssize_t num); +Object * make_procedure(Object *(*proc)(struct Environment *, Object *args)); +Object * make_pair(Object *car, Object *cdr); +Object * make_symbol(StringView sv); +Object * make_string(void); +void append_string(Object *obj, const StringView sv); + +// Object representation. +void display(Object *root); +void display_pair(Object *root); + +// Object comparison. +bool obj_eq(const Object *a, const Object* b); + +// Utility macros. +#define DEBUG_OBJ(MSG,OBJ) printf((MSG)); display(OBJ); printf("\n"); +#define PRINT_OBJ(OBJ) display(OBJ); printf("\n"); +#define MAKE_SYM(STR) make_symbol((StringView){(STR), sizeof(STR) - 1}) + +#endif // BDL_OBJECTS_H -- cgit v1.2.1