aboutsummaryrefslogtreecommitdiffstats
path: root/src/bootstrap/objects.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/bootstrap/objects.h')
-rw-r--r--src/bootstrap/objects.h77
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
6typedef 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
18struct Environment;
19
20typedef 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.
58Object * make_fixnum(ssize_t num);
59Object * make_procedure(Object *(*proc)(struct Environment *, struct Object *args));
60Object * make_pair(Object *car, Object *cdr);
61Object * make_symbol(StringView sv);
62Object * make_string(void);
63void append_string(Object *obj, const StringView sv);
64
65// Object representation.
66void display(Object *root);
67void display_pair(Object *root);
68
69// Object comparison.
70bool 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