-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjscheme.h
248 lines (207 loc) · 4.55 KB
/
jscheme.h
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
#include <stdio.h>
/*
* One header file to confuse them all ( and myself )
*/
#define DEBUG
#ifdef __WIN32__
typedef int jscheme_int32;
typedef long long jscheme_int64;
#else
typedef int jscheme_int32;
typedef long jscheme_int64;
#endif
#ifndef POINTER_SIZE
#if defined( __x86_64__ )
# define POINTER_SIZE 8
#else
# define POINTER_SIZE 4
# endif
#endif
#if POINTER_SIZE == 4
# define INT jscheme_int32
#else
#if POINTER_SIZE == 8
# define INT jscheme_int64
#else
# error "please define pointer size"
# endif
#endif
// fancy colors
#define RED "\x1B[31m"
#define GRN "\x1B[32m"
#define YEL "\x1B[33m"
#define BLU "\x1B[34m"
#define MAG "\x1B[35m"
#define CYN "\x1B[36m"
#define WHT "\x1B[37m"
#define RESET "\x1B[0m"
/*
* In JScheme everything will be a jschemeObject
*/
typedef struct jschemeObject *OBJ;
enum tag{
T_NIL,
T_TRUE,
T_FALSE,
T_INTEGER,
T_SYMBOL,
T_STRING,
T_FILESTREAM,
T_STRINGSTREAM,
T_CONS,
T_BUILTINFUNCTION,
T_BUILTINSYNTAX,
T_VOID,
T_GLOBALENVIRONMENT,
T_LOCALENVIRONMENT,
T_USERDEFINEDFUNCTION,
T_EOF,
};
extern const char* tag_lookup[];
extern OBJ globalEnvironment;
struct jschemeAny{
enum tag tag;
};
struct jschemeString{
enum tag tag;
char *stringVal;
};
struct jschemeSymbol{
enum tag tag;
char *symbolVal;
};
struct jschemeFileStream{
enum tag tag;
FILE *file;
int peekChar;
};
struct jschemeStringStream{
enum tag tag;
char* buffer;
int index;
};
struct jschemeInteger{
enum tag tag;
jscheme_int64 intVal;
};
struct jschemeCons{
enum tag tag;
OBJ car;
OBJ cdr;
};
typedef OBJ (*OBJFUNC)();
typedef void* (*VOIDPTRFUNC)();
struct jsBuiltinFunction{
enum tag tag;
char *internalName;
OBJFUNC theCode;
};
struct jsBuiltinSyntax{
enum tag tag;
char *internalName;
OBJFUNC theCode;
};
struct CP_jsBuiltinSyntax{
enum tag tag;
char *internalName;
VOIDPTRFUNC theCode;
};
struct jsUserDefinedFunction{
enum tag tag;
char *internalName;
int numLocals;
int numArgs;
OBJ home;
OBJ argList;
OBJ bodyList;
};
struct jsEnvironmentEntry{
OBJ key; // must be a symbol
OBJ value; // any object
};
typedef struct jsEnvironmentEntry JS_ENV_ENTRY;
struct jsEnvironment{
enum tag tag;
int numSlots;
OBJ parentEnvironment;
JS_ENV_ENTRY slots[];
};
struct jschemeObject{
// More Types will be added
union {
struct jschemeAny any;
struct jschemeInteger integer;
struct jschemeSymbol symbol;
struct jschemeString string;
struct jschemeFileStream fileStream;
struct jschemeStringStream stringStream;
struct jschemeCons cons;
struct jsBuiltinFunction builtinFunction;
struct jsBuiltinSyntax builtinSyntax;
struct CP_jsBuiltinSyntax CP_builtinSyntax;
struct jsEnvironment environment;
struct jsUserDefinedFunction userDefinedFunction;
} u;
};
/*
* macros
*/
#ifdef DEBUG
#define ASSERT(expr,msg){ ((!(expr)) ? error(msg, __FILE__, __LINE__): 0); }
#else
#define ASSERT(expr,msg) {}
#endif
#define TAG(o) ((o)->u.any.tag)
#define CAR(o) ((o)->u.cons.car)
#define CDR(o) ((o)->u.cons.cdr)
#define INTVAL(o) ((o)->u.integer.intVal)
#define SYMBOLVAL(o) ((o)->u.symbol.symbolVal)
#define STRINGVAL(o) ((o)->u.string.stringVal)
#define SET_CAR(o, newCar) ((o)->u.cons.car = (newCar))
#define SET_CDR(o, newCdr) ((o)->u.cons.cdr = (newCdr))
#define ISNIL(o) (TAG(o) == T_NIL)
#define ISTRUE(o) (TAG(o) == T_TRUE)
#define ISFALSE(o) (TAG(o) == T_FALSE)
#define ISINTEGER(o) (TAG(o) == T_INTEGER)
#define ISSYMBOL(o) (TAG(o) == T_SYMBOL)
#define ISSTRING(o) (TAG(o) == T_STRING)
#define ISCONS(o) (TAG(o) == T_CONS)
#define ISBUILTINF(o) (TAG(o) == T_BUILTINFUNCTION)
#define ISBUILTINS(o) (TAG(o) == T_BUILTINSYNTAX)
#define ISVOID(o) (TAG(o) == T_VOID)
#define ISUDF(o) (TAG(o) == T_USERDEFINEDFUNCTION)
#define ISENV(o) (TAG(o) == T_GLOBALENVIRONMENT || TAG(o) == T_LOCALENVIRONMENT)
/*
* well known objects
*/
OBJ js_nil, js_true, js_false, js_void, js_eof;
OBJ js_sym_define, js_sym_lambda;
#ifdef DEBUG
# define DEBUGCODE(option, code){ ((option) ? code : 0); }
#else
# define DEBUGCODE(option, code) // nothing
#endif
#ifdef DEBUG
/*
* debug tracing
*/
#define INDENT " "
extern int indentLevel;
extern int indentLevelForInclude;
extern int oldIndentLevel;
extern int PAUSE_INDENT_FLAG;
extern struct debugOption *DETAILED_TYPES;
extern struct debugOption *EVAL_TRACE;
extern struct debugOption *CONTINUATION_PASSING;
extern struct debugOption *PRINT_STACK;
extern struct debugOption *PRINT_INCLUDE;
struct debugOption{
char *name;
char *identifier;
int state;
};
void switchDebugOptions(OBJ);
void initDebugOptions();
#endif
#include "jschemeInternals.h"
#include "jschemeStack.h"