diff options
Diffstat (limited to 'src/bootstrap/objects.h')
-rw-r--r-- | src/bootstrap/objects.h | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/src/bootstrap/objects.h b/src/bootstrap/objects.h new file mode 100644 index 0000000..56821eb --- /dev/null +++ b/src/bootstrap/objects.h | |||
@@ -0,0 +1,77 @@ | |||
1 | #ifndef BDL_OBJECTS_H | ||
2 | #define BDL_OBJECTS_H | ||
3 | |||
4 | #include "string_view.h" | ||
5 | |||
6 | typedef enum ObjectType { | ||
7 | OBJ_TYPE_FIXNUM, | ||
8 | OBJ_TYPE_BOOL, | ||
9 | OBJ_TYPE_NIL, | ||
10 | OBJ_TYPE_SYMBOL, | ||
11 | OBJ_TYPE_STRING, | ||
12 | OBJ_TYPE_PAIR, | ||
13 | OBJ_TYPE_PROCEDURE, | ||
14 | OBJ_TYPE_LAMBDA, | ||
15 | OBJ_TYPE_ERR, | ||
16 | } ObjectType; | ||
17 | |||
18 | struct Environment; | ||
19 | |||
20 | typedef struct Object { | ||
21 | ObjectType type; | ||
22 | bool marked; | ||
23 | union { | ||
24 | // OBJ_TYPE_FIXNUM | ||
25 | ssize_t fixnum; | ||
26 | |||
27 | // OBJ_TYPE_STRING | ||
28 | struct { | ||
29 | char *string; | ||
30 | size_t string_n; | ||
31 | }; | ||
32 | |||
33 | // OBJ_TYPE_PAIR | ||
34 | struct { | ||
35 | struct Object *car; | ||
36 | struct Object *cdr; | ||
37 | }; | ||
38 | |||
39 | // OBJ_TYPE_SYMBOL | ||
40 | struct { | ||
41 | char *symbol; | ||
42 | size_t symbol_n; | ||
43 | }; | ||
44 | |||
45 | // OBJ_TYPE_PROCEDURE | ||
46 | struct Object *(*proc)(struct Environment *env, struct Object *args); | ||
47 | |||
48 | // OBJ_TYPE_LAMBDA | ||
49 | struct { | ||
50 | struct Object *params; | ||
51 | struct Object *body; | ||
52 | struct Environment *env; | ||
53 | }; | ||
54 | }; | ||
55 | } Object; | ||
56 | |||
57 | // Object constructors. | ||
58 | Object * make_fixnum(ssize_t num); | ||
59 | Object * make_procedure(Object *(*proc)(struct Environment *, struct Object *args)); | ||
60 | Object * make_pair(Object *car, Object *cdr); | ||
61 | Object * make_symbol(StringView sv); | ||
62 | Object * make_string(void); | ||
63 | void append_string(Object *obj, const StringView sv); | ||
64 | |||
65 | // Object representation. | ||
66 | void display(Object *root); | ||
67 | void display_pair(Object *root); | ||
68 | |||
69 | // Object comparison. | ||
70 | bool obj_eq(Object *a, Object* b); | ||
71 | |||
72 | // Utility macros. | ||
73 | #define DEBUG_OBJ(MSG,OBJ) printf((MSG)); display(OBJ); printf("\n"); | ||
74 | #define PRINT_OBJ(OBJ) display(OBJ); printf("\n"); | ||
75 | #define MAKE_SYM(STR) make_symbol((StringView){(STR), sizeof(STR) - 1}) | ||
76 | |||
77 | #endif // BDL_OBJECTS_H | ||