diff options
Diffstat (limited to 'src/bytecode/objects.h')
-rwxr-xr-x | src/bytecode/objects.h | 39 |
1 files changed, 32 insertions, 7 deletions
diff --git a/src/bytecode/objects.h b/src/bytecode/objects.h index 35a954f..17809d5 100755 --- a/src/bytecode/objects.h +++ b/src/bytecode/objects.h | |||
@@ -1,6 +1,9 @@ | |||
1 | #ifndef BDL_OBJECTS_H | 1 | #ifndef BDL_OBJECTS_H |
2 | #define BDL_OBJECTS_H | 2 | #define BDL_OBJECTS_H |
3 | 3 | ||
4 | #include "string_view.h" | ||
5 | #include "darray.h" | ||
6 | |||
4 | typedef enum ObjectType { | 7 | typedef enum ObjectType { |
5 | OBJ_TYPE_NIL, | 8 | OBJ_TYPE_NIL, |
6 | OBJ_TYPE_TRUE, | 9 | OBJ_TYPE_TRUE, |
@@ -24,9 +27,9 @@ typedef struct Object { | |||
24 | 27 | ||
25 | // OBJ_TYPE_STRING | 28 | // OBJ_TYPE_STRING |
26 | // OBJ_TYPE_SYMBOL | 29 | // OBJ_TYPE_SYMBOL |
27 | // struct { | 30 | struct { |
28 | // char *text; | 31 | char *text; |
29 | // }; | 32 | }; |
30 | 33 | ||
31 | // OBJ_TYPE_PAIR | 34 | // OBJ_TYPE_PAIR |
32 | // struct { | 35 | // struct { |
@@ -59,6 +62,28 @@ void display(Object obj); | |||
59 | #define IS_TRUE(VAL) ((VAL).type != OBJ_TYPE_FALSE) | 62 | #define IS_TRUE(VAL) ((VAL).type != OBJ_TYPE_FALSE) |
60 | #define IS_FALSE(VAL) ((VAL).type == OBJ_TYPE_FALSE) | 63 | #define IS_FALSE(VAL) ((VAL).type == OBJ_TYPE_FALSE) |
61 | #define IS_FIXNUM(VAL) ((VAL).type == OBJ_TYPE_FIXNUM) | 64 | #define IS_FIXNUM(VAL) ((VAL).type == OBJ_TYPE_FIXNUM) |
65 | #define IS_STRING(VAL) ((VAL).type == OBJ_TYPE_STRING) | ||
66 | #define IS_SYMBOL(VAL) ((VAL).type == OBJ_TYPE_SYMBOL) | ||
67 | |||
68 | Object make_string(StringView sv) { | ||
69 | Object obj = { | ||
70 | .type = OBJ_TYPE_STRING, | ||
71 | .text = NULL, | ||
72 | }; | ||
73 | array_init(obj.text, sv.n); | ||
74 | array_insert(obj.text, sv.start, sv.n); | ||
75 | return obj; | ||
76 | } | ||
77 | |||
78 | Object make_symbol(StringView sv) { | ||
79 | Object obj = { | ||
80 | .type = OBJ_TYPE_SYMBOL, | ||
81 | .text = NULL, | ||
82 | }; | ||
83 | array_init(obj.text, sv.n); | ||
84 | array_insert(obj.text, sv.start, sv.n); | ||
85 | return obj; | ||
86 | } | ||
62 | 87 | ||
63 | void | 88 | void |
64 | display(Object obj) { | 89 | display(Object obj) { |
@@ -67,19 +92,19 @@ display(Object obj) { | |||
67 | printf("%zd", obj.fixnum); | 92 | printf("%zd", obj.fixnum); |
68 | } break; | 93 | } break; |
69 | case OBJ_TYPE_TRUE: { | 94 | case OBJ_TYPE_TRUE: { |
70 | printf("true"); | 95 | printf("true"); |
71 | } break; | 96 | } break; |
72 | case OBJ_TYPE_FALSE: { | 97 | case OBJ_TYPE_FALSE: { |
73 | printf("false"); | 98 | printf("false"); |
74 | } break; | 99 | } break; |
75 | case OBJ_TYPE_NIL: { | 100 | case OBJ_TYPE_NIL: { |
76 | printf("()"); | 101 | printf("()"); |
77 | } break; | 102 | } break; |
78 | case OBJ_TYPE_STRING: { | 103 | case OBJ_TYPE_STRING: { |
79 | // printf("\"%.*s\"", (int)array_size(obj.string), obj.string); | 104 | printf("\"%.*s\"", (int)array_size(obj.text), obj.text); |
80 | } break; | 105 | } break; |
81 | case OBJ_TYPE_SYMBOL: { | 106 | case OBJ_TYPE_SYMBOL: { |
82 | // printf(":%.*s", (int)array_size(obj.symbol), obj.symbol); | 107 | printf(":%.*s", (int)array_size(obj.text), obj.text); |
83 | } break; | 108 | } break; |
84 | case OBJ_TYPE_PAIR: { | 109 | case OBJ_TYPE_PAIR: { |
85 | // printf("("); | 110 | // printf("("); |