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
76
77
78
79
80
81
82
83
84
85
86
87
|
#ifndef BAMBOO_LISP_SEXP_H_
#define BAMBOO_LISP_SEXP_H_
#include <stdint.h>
#include <stdbool.h>
#include <algds/vec.h>
struct sexp;
typedef struct sexp SExp;
typedef struct {
int idx;
} SExpRef;
typedef struct {
SExpRef car;
SExpRef cdr;
} SExpPair;
typedef struct {
SExpRef args;
SExpRef body;
SExpRef env;
} SExpFunc;
typedef struct {
SExpRef args;
SExpRef body;
} SExpMacro;
typedef struct {
SExpRef parent;
SExpRef bindings;
} SExpEnv;
typedef struct {
SExpRef name;
SExpRef value;
SExpRef func;
SExpRef next;
} SExpBinding;
typedef enum {
kEmptySExp,
kIntegerSExp,
kRealSExp,
kBooleanSExp,
kNilSExp,
kCharSExp,
kStringSExp,
kSymbolSExp,
kUserDataSExp,
kPairSExp,
kFuncSExp,
kEnvSExp,
kBindingSExp,
kMacroSExp,
kErrSExp,
} SExpType;
struct sexp {
bool marked;
SExpType type;
union {
int64_t integer;
double real;
bool boolean;
char character;
const char *str;
const void *userdata;
SExpPair pair;
SExpFunc func;
SExpEnv env;
SExpBinding binding;
SExpMacro macro;
};
};
void SExp_show(SExp self, FILE* fp);
void SExpRef_show(SExpRef self, FILE* fp);
VECTOR_DEF(SExp);
VECTOR_DEF(SExpRef);
#endif
|