Attempting to correct some (def) weirdness
This commit is contained in:
parent
f9cb2d544a
commit
3a413c28fc
36
src/env.c
36
src/env.c
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue