diff options
Diffstat (limited to 'src/bytecode/objects.h')
-rwxr-xr-x | src/bytecode/objects.h | 81 |
1 files changed, 76 insertions, 5 deletions
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 @@ | |||
2 | #define BDL_OBJECTS_H | 2 | #define BDL_OBJECTS_H |
3 | 3 | ||
4 | typedef enum ObjectType { | 4 | typedef enum ObjectType { |
5 | OBJ_TYPE_FIXNUM, | ||
6 | OBJ_TYPE_BOOL, | ||
7 | OBJ_TYPE_NIL, | 5 | OBJ_TYPE_NIL, |
6 | OBJ_TYPE_TRUE, | ||
7 | OBJ_TYPE_FALSE, | ||
8 | OBJ_TYPE_FIXNUM, | ||
8 | OBJ_TYPE_SYMBOL, | 9 | OBJ_TYPE_SYMBOL, |
9 | OBJ_TYPE_STRING, | 10 | OBJ_TYPE_STRING, |
10 | OBJ_TYPE_PAIR, | 11 | OBJ_TYPE_PAIR, |
11 | OBJ_TYPE_PROCEDURE, | ||
12 | OBJ_TYPE_LAMBDA, | 12 | OBJ_TYPE_LAMBDA, |
13 | OBJ_TYPE_ERR, | 13 | OBJ_TYPE_ERR, |
14 | } ObjectType; | 14 | } ObjectType; |
15 | 15 | ||
16 | struct Environment; | 16 | struct Environment; |
17 | 17 | ||
18 | typedef s64 Object; | 18 | typedef struct Object { |
19 | ObjectType type; | ||
20 | bool marked; | ||
21 | union { | ||
22 | // OBJ_TYPE_FIXNUM | ||
23 | ssize_t fixnum; | ||
24 | |||
25 | // OBJ_TYPE_STRING | ||
26 | // OBJ_TYPE_SYMBOL | ||
27 | // struct { | ||
28 | // char *text; | ||
29 | // }; | ||
30 | |||
31 | // OBJ_TYPE_PAIR | ||
32 | // struct { | ||
33 | // struct Object *car; | ||
34 | // struct Object *cdr; | ||
35 | // }; | ||
36 | |||
37 | // OBJ_TYPE_LAMBDA | ||
38 | // struct { | ||
39 | // struct Object *params; | ||
40 | // struct Object *body; | ||
41 | // struct Environment *env; | ||
42 | // }; | ||
43 | }; | ||
44 | } Object; | ||
19 | 45 | ||
20 | void display(Object obj); | 46 | void display(Object obj); |
21 | 47 | ||
48 | // Value initialization. | ||
49 | #define NIL_VAL ((Object){.type = OBJ_TYPE_NIL}) | ||
50 | #define TRUE_VAL ((Object){.type = OBJ_TYPE_TRUE}) | ||
51 | #define FALSE_VAL ((Object){.type = OBJ_TYPE_FALSE}) | ||
52 | #define FIXNUM_VAL(VAL) ((Object){.type = OBJ_TYPE_FIXNUM, .fixnum = VAL}) | ||
53 | |||
54 | // Value extraction. | ||
55 | #define AS_FIXNUM(VAL) ((VAL).fixnum) | ||
56 | |||
57 | // Type checking. | ||
58 | #define IS_TRUE(VAL) ((VAL).type != OBJ_TYPE_FALSE) | ||
59 | #define IS_FALSE(VAL) ((VAL).type == OBJ_TYPE_FALSE) | ||
60 | #define IS_FIXNUM(VAL) ((VAL).type == OBJ_TYPE_FIXNUM) | ||
61 | |||
22 | void | 62 | void |
23 | display(Object obj) { | 63 | display(Object obj) { |
24 | printf("%ld", obj); | 64 | switch (obj.type) { |
65 | case OBJ_TYPE_FIXNUM: { | ||
66 | printf("%zd", obj.fixnum); | ||
67 | } break; | ||
68 | case OBJ_TYPE_TRUE: { | ||
69 | printf("true"); | ||
70 | } break; | ||
71 | case OBJ_TYPE_FALSE: { | ||
72 | printf("false"); | ||
73 | } break; | ||
74 | case OBJ_TYPE_NIL: { | ||
75 | printf("()"); | ||
76 | } break; | ||
77 | case OBJ_TYPE_STRING: { | ||
78 | // printf("\"%.*s\"", (int)array_size(obj.string), obj.string); | ||
79 | } break; | ||
80 | case OBJ_TYPE_SYMBOL: { | ||
81 | // printf(":%.*s", (int)array_size(obj.symbol), obj.symbol); | ||
82 | } break; | ||
83 | case OBJ_TYPE_PAIR: { | ||
84 | // printf("("); | ||
85 | // display_pair(obj); | ||
86 | // printf(")"); | ||
87 | } break; | ||
88 | case OBJ_TYPE_LAMBDA: { | ||
89 | printf("#{procedure}"); | ||
90 | } break; | ||
91 | case OBJ_TYPE_ERR: { | ||
92 | printf("#{error}"); | ||
93 | } break; | ||
94 | } | ||
95 | return; | ||
25 | } | 96 | } |
26 | 97 | ||
27 | #endif // BDL_OBJECTS_H | 98 | #endif // BDL_OBJECTS_H |