1 struct _EnvironmentNode;
2 typedef struct _EnvironmentNode _EnvironmentNode;
3 struct _EnvironmentNode {
6 _EnvironmentNode* next;
10 size_t referenceCount;
11 Environment* shadowed;
12 _EnvironmentNode* top;
15 struct Environment_get_Result;
16 typedef struct Environment_get_Result Environment_get_Result;
17 struct Environment_get_Result {
22 void Environment_initialize(Environment* self, Environment* shadowed) {
23 self->referenceCount = 1;
24 self->shadowed = shadowed;
28 void Environment_deinitialize(Environment* self) {
29 assert(self->referenceCount == 0);
31 while(self->top != NULL) {
32 _EnvironmentNode* en = self->top;
34 Object_deinitialize(&(en->value));
39 Environment* Environment_construct(Environment* shadowed) {
40 Environment* result = malloc(sizeof(Environment));
41 Environment_initialize(result, shadowed);
45 Environment* Environment_reference(Environment* self) {
46 self->referenceCount++; // TODO Do we need to make this thread safe?
50 void Environment_destruct(Environment* self) {
51 self->referenceCount--; // TODO Do we need to make this thread safe?
52 if(self->referenceCount == 0) {
53 Environment_deinitialize(self);
58 Environment_get_Result Environment_getShallow(Environment* self, char* symbol) {
59 for(_EnvironmentNode* current = self->top; current != NULL; current = current->next) {
60 if(strcmp(current->symbol, symbol) == 0) {
61 return (Environment_get_Result) { true, current->value };
64 return (Environment_get_Result) { false, BUILTIN_NIL };
67 Environment_get_Result Environment_get(Environment* self, char* symbol) {
68 for(; self != NULL; self = self->shadowed) {
69 Environment_get_Result result = Environment_getShallow(self, symbol);
70 if(result.found) return result;
72 return (Environment_get_Result) { false, BUILTIN_NIL };
75 void Environment_set(Environment* self, char* symbol, Object value) {
76 assert(!(Environment_getShallow(self, symbol).found));
78 _EnvironmentNode* en = malloc(sizeof(_EnvironmentNode));