1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
#ifndef BDL_OBJECTS_H
#define BDL_OBJECTS_H
#include "string_view.h"
typedef enum ObjectType {
OBJ_TYPE_FIXNUM,
OBJ_TYPE_BOOL,
OBJ_TYPE_NIL,
OBJ_TYPE_SYMBOL,
OBJ_TYPE_STRING,
OBJ_TYPE_PAIR,
OBJ_TYPE_PROCEDURE,
OBJ_TYPE_LAMBDA,
OBJ_TYPE_ERR,
} ObjectType;
struct Environment;
typedef struct Object {
ObjectType type;
bool marked;
union {
// OBJ_TYPE_FIXNUM
ssize_t fixnum;
// OBJ_TYPE_STRING
struct {
char *string;
};
// OBJ_TYPE_PAIR
struct {
struct Object *car;
struct Object *cdr;
};
// OBJ_TYPE_SYMBOL
struct {
char *symbol;
};
// OBJ_TYPE_PROCEDURE
struct Object *(*proc)(struct Environment *env, struct Object *args);
// OBJ_TYPE_LAMBDA
struct {
struct Object *params;
struct Object *body;
struct Environment *env;
};
};
} Object;
// Object constructors.
Object * make_fixnum(ssize_t num);
Object * make_procedure(Object *(*proc)(struct Environment *, Object *args));
Object * make_pair(Object *car, Object *cdr);
Object * make_symbol(StringView sv);
Object * make_string(void);
void append_string(Object *obj, const StringView sv);
// Object representation.
void display(Object *root);
void display_pair(Object *root);
// Object comparison.
bool obj_eq(const Object *a, const Object* b);
// Utility macros.
#define DEBUG_OBJ(MSG,OBJ) printf((MSG)); display(OBJ); printf("\n");
#define PRINT_OBJ(OBJ) display(OBJ); printf("\n");
#define MAKE_SYM(STR) make_symbol((StringView){(STR), sizeof(STR) - 1})
#endif // BDL_OBJECTS_H
|