aboutsummaryrefslogtreecommitdiffstats
path: root/src/bytecode/objects.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/bytecode/objects.h')
-rwxr-xr-xsrc/bytecode/objects.h81
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
4typedef enum ObjectType { 4typedef 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
16struct Environment; 16struct Environment;
17 17
18typedef s64 Object; 18typedef 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
20void display(Object obj); 46void 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
22void 62void
23display(Object obj) { 63display(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