Attempting to correct some (def) weirdness

This commit is contained in:
Sage Vaillancourt 2020-11-02 07:58:09 -05:00
parent f9cb2d544a
commit 3a413c28fc
1 changed files with 35 additions and 1 deletions

View File

@ -72,22 +72,56 @@ struct Environment envForLambda(const Object *params, const Object *arg_forms,
return env; return env;
} }
// Determine if a given symbol exists in the given environment chain
//
// Modifies `env` to the environment that the symbol was found in, only if the
// symbol was found
//
// Returns the index of the symbol in the environment, if found. Otherwise, -1
int findInEnv(struct Environment **env, const char *name)
{
struct Environment *temp_env = *env;
while(temp_env) {
for(int i = 0; i < temp_env->size; i++) {
if(temp_env->strings[i] == NULL) {
break;
}
if(strcmp(temp_env->strings[i], name) == 0) {
*env = temp_env;
return i;
}
}
temp_env = temp_env->outer;
}
return -1;
}
// TODO Maybe extend environment using a new outer, instead of realloc // TODO Maybe extend environment using a new outer, instead of realloc
void addToEnv(struct Environment *env, const char *name, const Object obj) void addToEnv(struct Environment *env, const char *name, const Object obj)
{ {
// int sym_pos = findInEnv(&env, name);
// if(sym_pos != -1) {
// Object o = cloneObject(obj);
// cleanObject(&env->objects[sym_pos]);
// env->objects[sym_pos] = o;
// return;
// }
int i; int i;
struct Environment *temp_env = env; struct Environment *temp_env = env;
while(temp_env) { while(temp_env) {
for(i = 0; i < temp_env->size; i++) { for(i = 0; i < temp_env->size; i++) {
if(temp_env->strings[i] == NULL) { if(temp_env->strings[i] == NULL) {
//printf("Add new object\n");
temp_env->strings[i] = calloc(sizeof(char), strlen(name) + 1); temp_env->strings[i] = calloc(sizeof(char), strlen(name) + 1);
strncpy(temp_env->strings[i], name, strlen(name)); strncpy(temp_env->strings[i], name, strlen(name));
temp_env->objects[i] = cloneObject(obj); temp_env->objects[i] = cloneObject(obj);
return; return;
} }
if(strcmp(temp_env->strings[i], name) == 0) { if(strcmp(temp_env->strings[i], name) == 0) {
Object o = cloneObject(obj);
cleanObject(&temp_env->objects[i]); cleanObject(&temp_env->objects[i]);
temp_env->objects[i] = cloneObject(obj); temp_env->objects[i] = o;
return; return;
} }
} }