-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSchemeObject.h
172 lines (139 loc) · 7.26 KB
/
SchemeObject.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
/*
* SchemeObject.h
* scheme_compiler
*
*/
#ifndef SCHEME_OBJECT_H
#define SCHEME_OBJECT_H
#include "MemorySpace.h"
#include <assert.h>
// for memcpy
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "SchemeObject_tests.h"
#define DEFAULT_MEMORY_FOR_MACHINE 10000000
struct _SchemeObject;
typedef enum {INTEGER, DOUBLE, CHAR, PAIR, POINTER, MEMORY_CHUNK, SYMBOL, STRING, EMPTY, ATOMIC_FUNCTION, COMPOSITE_FUNCTION, EXEC_EVAL, EXEC_APPLY, SPECIAL_SYMBOL, CAPTURED_CONTINUATION, EXEC_EVALSEQ} DataType;
typedef enum {FALSE, TRUE, LAMBDA, QUOTE, SET, CALLCC, IF, DEFINE} SpecialSymbol;
typedef struct _ConsPair {
struct _SchemeObject * car;
struct _SchemeObject * cdr;
} ConsPair;
typedef struct _LambdaTriplet {
struct _SchemeObject * arg_symbols;
struct _SchemeObject * body;
struct _SchemeObject * enclosed_env;
} LambdaTriplet;
typedef struct _ExecEval {
struct _SchemeObject * expr;
struct _SchemeObject * env;
struct _SchemeObject * output;
struct _SchemeObject * continuation;
} ExecEval;
typedef struct _ExecApply {
struct _SchemeObject * func;
struct _SchemeObject * resolved_args;
struct _SchemeObject * output;
struct _SchemeObject * continuation;
} ExecApply;
typedef struct _CapturedContinuation {
struct _SchemeObject * continuation;
struct _SchemeObject * output;
} CapturedContinuation;
typedef struct _MemoryChunk {
int size;
void * data;
} MemoryChunk;
typedef union _Content {
int val_integer;
double val_double;
ConsPair val_pair;
void * val_pointer;
char val_char;
ExecApply val_apply;
ExecEval val_eval;
LambdaTriplet val_lambda;
MemoryChunk val_memorychunk;
SpecialSymbol val_special_symbol;
CapturedContinuation val_capturedcontinuation;
} Content;
typedef struct _SchemeObject {
DataType type;
Content data;
struct _SchemeObject * garbage_collection_redirection_address;
} SchemeObject;
int SchemeObject_get_integer(SchemeObject * E);
double SchemeObject_get_double(SchemeObject * E);
char SchemeObject_get_char(SchemeObject * E);
SchemeObject * SchemeObject_car(SchemeObject * P);
SchemeObject * SchemeObject_cdr(SchemeObject * P);
SchemeObject * SchemeObject_first(SchemeObject * P);
SchemeObject * SchemeObject_rest(SchemeObject * P);
SchemeObject * SchemeObject_second(SchemeObject * P);
SchemeObject * SchemeObject_third(SchemeObject * P);
SchemeObject * SchemeObject_make_integer(MemorySpace * ms, int value);
SchemeObject * SchemeObject_make_double(MemorySpace * ms, double value);
SchemeObject * SchemeObject_make_empty(MemorySpace * ms);
SchemeObject * SchemeObject_make_string(MemorySpace * ms, char * str);
SchemeObject * SchemeObject_make_symbol(MemorySpace * ms, char * str);
SchemeObject * SchemeObject_make_char(MemorySpace * ms, char c);
SchemeObject * SchemeObject_make_special_symbol_s(MemorySpace * ms, SpecialSymbol S);
SchemeObject * SchemeObject_make_pair(MemorySpace * ms, SchemeObject * left, SchemeObject * right);
SchemeObject * SchemeObject_make_atomic_function(MemorySpace * ms, void * ptr_C_impl);
SchemeObject * SchemeObject_make_composite_function(MemorySpace * ms, SchemeObject * arg_symbols, SchemeObject * body, SchemeObject * enclosed_env);
SchemeObject * SchemeObject_make_exec_apply(MemorySpace * ms, SchemeObject * func, SchemeObject * resolved_args, SchemeObject * output, SchemeObject * continuation);
SchemeObject * SchemeObject_make_exec_eval(MemorySpace * ms, SchemeObject * expr, SchemeObject * env, SchemeObject * output, SchemeObject * continuation);
int SchemeObject_length(SchemeObject * L);
/* these boolean functions look strange due to the lack of boolean values in C */
int SchemeObject_is_pair(SchemeObject * E);
int SchemeObject_is_integer(SchemeObject * E);
int SchemeObject_is_double(SchemeObject * E);
int SchemeObject_is_empty(SchemeObject * E);
int SchemeObject_is_symbol(SchemeObject * E);
int SchemeObject_is_string(SchemeObject * E);
int SchemeObject_is_memorychunk(SchemeObject * E);
int SchemeObject_is_char(SchemeObject * E);
int SchemeObject_eq(SchemeObject * x, SchemeObject * y);
int SchemeObject_eq_memorychunks(SchemeObject * x, SchemeObject * y);
int SchemeObject_is_atomic_function(SchemeObject * E);
int SchemeObject_is_composite_function(SchemeObject * E);
int SchemeObject_is_exec_apply(SchemeObject * E);
int SchemeObject_is_exec_eval(SchemeObject * E);
int SchemeObject_is_exec_evalseq(SchemeObject * E);
int SchemeObject_is_capturedcontinuation(SchemeObject * E);
int SchemeObject_is_special_symbol(SchemeObject * E);
int SchemeObject_is_special_symbol_s(SchemeObject * E, SpecialSymbol S);
int SchemeObject_is_self_evaluating(SchemeObject * E);
void SchemeObject_print(SchemeObject * E);
void SchemeObject_print_details(SchemeObject * E);
int SchemeObject_copy(MemorySpace * ms, SchemeObject * dest, SchemeObject * source);
SchemeObject * SchemeObject_make_list_n(MemorySpace * ms, int length);
SchemeObject * SchemeObject_zip(MemorySpace * ms, SchemeObject * A, SchemeObject * B);
SchemeObject * SchemeObject_reverse_reference_list(MemorySpace * ms, SchemeObject * L);
SchemeObject * SchemeObject_list_ref_n(SchemeObject * L, int n);
SchemeObject * SchemeObject_make_bool(MemorySpace * ms, int E);
SchemeObject * SchemeObject_make_list_1(MemorySpace * ms, SchemeObject * A);
SchemeObject * SchemeObject_make_list_2(MemorySpace * ms, SchemeObject * A, SchemeObject * B);
SchemeObject * SchemeObject_make_list_3(MemorySpace * ms, SchemeObject * A, SchemeObject * B, SchemeObject * C);
SchemeObject * SchemeObject_make_list_4(MemorySpace * ms, SchemeObject * A, SchemeObject * B, SchemeObject * C, SchemeObject * D);
SchemeObject * SchemeObject_make_list_5(MemorySpace * ms, SchemeObject * A, SchemeObject * B, SchemeObject * C, SchemeObject * D, SchemeObject * E);
SchemeObject * SchemeObject_make_list_6(MemorySpace * ms, SchemeObject * A, SchemeObject * B, SchemeObject * C, SchemeObject * D, SchemeObject * E, SchemeObject * F);
SchemeObject * SchemeObject_make_list_7(MemorySpace * ms, SchemeObject * A, SchemeObject * B, SchemeObject * C, SchemeObject * D, SchemeObject * E, SchemeObject * F, SchemeObject * G);
SchemeObject * frame_binding_lookup(SchemeObject * frame, SchemeObject * symbol);
SchemeObject * env_binding_lookup(SchemeObject * env, SchemeObject * symbol);
SchemeObject * env_value_lookup(SchemeObject * env, SchemeObject * symbol);
int env_set_existing_binding(MemorySpace * ms, SchemeObject * env, SchemeObject * symbol, SchemeObject * value);
SchemeObject * SchemeObject_make_single_binding(MemorySpace * ms, SchemeObject * symbol, SchemeObject * value);
SchemeObject * execute(MemorySpace * ms, SchemeObject * location);
SchemeObject * evaluate(MemorySpace * ms, SchemeObject * expr, SchemeObject * env);
/* adds all the elements from a list (a chain of pairs ending with an empty element) */
SchemeObject * sum_wrapper(MemorySpace *ms, SchemeObject * L);
SchemeObject * make_base_environment(MemorySpace * ms);
SchemeObject * make_base_parser_environment(MemorySpace * ms);
void GarbageCollection_reset_redirection_address(SchemeObject * E);
SchemeObject * GarbageCollection_floodfill_move_to_new_MemorySpace(MemorySpace * new_ms, SchemeObject * start);
SchemeObject * sn1t_automem_parse_evaluate(char * str, MemorySpace ** out_ms);
int GarbageCollector_stackabuse_checkisomorphism(SchemeObject * A, SchemeObject * B, int currentdepth, int maxdepth);
SchemeObject * SchemeObject_exec_get_output(SchemeObject * E);
#endif