aboutsummaryrefslogtreecommitdiffstats
path: root/src/bootstrap/objects.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bootstrap/objects.c')
-rw-r--r--src/bootstrap/objects.c66
1 files changed, 2 insertions, 64 deletions
diff --git a/src/bootstrap/objects.c b/src/bootstrap/objects.c
index 09076db..359329b 100644
--- a/src/bootstrap/objects.c
+++ b/src/bootstrap/objects.c
@@ -1,70 +1,10 @@
1typedef enum ObjectType { 1#include "gc.h"
2 OBJ_TYPE_FIXNUM, 2#include "objects.h"
3 OBJ_TYPE_BOOL,
4 OBJ_TYPE_NIL,
5 OBJ_TYPE_SYMBOL,
6 OBJ_TYPE_STRING,
7 OBJ_TYPE_PAIR,
8 OBJ_TYPE_PROCEDURE,
9 OBJ_TYPE_LAMBDA,
10 OBJ_TYPE_ERR,
11} ObjectType;
12
13struct Environment;
14
15typedef struct Object {
16 ObjectType type;
17 bool marked;
18 union {
19 // OBJ_TYPE_FIXNUM
20 ssize_t fixnum;
21
22 // OBJ_TYPE_STRING
23 struct {
24 char *string;
25 size_t string_n;
26 };
27
28 // OBJ_TYPE_PAIR
29 struct {
30 struct Object *car;
31 struct Object *cdr;
32 };
33
34 // OBJ_TYPE_SYMBOL
35 struct {
36 char *symbol;
37 size_t symbol_n;
38 };
39
40 // OBJ_TYPE_PROCEDURE
41 struct Object *(*proc)(struct Environment *env, struct Object *args);
42
43 // OBJ_TYPE_LAMBDA
44 struct {
45 struct Object *params;
46 struct Object *body;
47 struct Environment *env;
48 };
49 };
50} Object;
51
52//
53// Singletons.
54//
55
56static Object *obj_nil;
57static Object *obj_true;
58static Object *obj_false;
59static Object *obj_err;
60static Object *obj_quote;
61 3
62// 4//
63// Constructors. 5// Constructors.
64// 6//
65 7
66Object * alloc_object(ObjectType);
67
68Object * 8Object *
69make_fixnum(ssize_t num) { 9make_fixnum(ssize_t num) {
70 Object *obj = alloc_object(OBJ_TYPE_FIXNUM); 10 Object *obj = alloc_object(OBJ_TYPE_FIXNUM);
@@ -116,8 +56,6 @@ append_string(Object *obj, const StringView sv) {
116 obj->string_n += sv.n; 56 obj->string_n += sv.n;
117} 57}
118 58
119void display(Object *root);
120
121void 59void
122display_pair(Object *root) { 60display_pair(Object *root) {
123 display(root->car); 61 display(root->car);