commit cd75a060c3c6edcfb800c1ca2f3b383a2b2e6553
parent 21a0a4edab8bc05cb6fdc0ab91f2c1179b56dcc9
Author: NunoSempere <nuno.sempere@protonmail.com>
Date: Sun, 7 May 2023 13:01:23 -0400
add parent/child env distinction when defining a new sym
Diffstat:
1 file changed, 21 insertions(+), 12 deletions(-)
diff --git a/src/mumble.c b/src/mumble.c
@@ -335,7 +335,7 @@ lispval* get_from_lispenv(char* sym, lispenv* env)
// and this explains shadowing!
}
-void insert_in_lispenv(char* sym, lispval* v, lispenv* env)
+void insert_in_current_lispenv(char* sym, lispval* v, lispenv* env)
{
int found = 0;
for (int i = 0; i < env->count; i++) {
@@ -358,23 +358,32 @@ void insert_in_lispenv(char* sym, lispval* v, lispenv* env)
}
}
-lispenv* clone_lispenv(lispenv* origin_env){
+void insert_in_parentmost_lispenv(char* sym, lispval* v, lispenv* env)
+{
+ // note that you could have two chains of envs, though hopefully not.
+ while (env->parent != NULL) {
+ env = env->parent;
+ }
+ insert_in_current_lispenv(sym, v, env);
+}
+
+lispenv* clone_lispenv(lispenv* origin_env)
+{
lispenv* new_env = malloc(sizeof(lispenv));
new_env->count = origin_env->count;
new_env->parent = origin_env->parent;
new_env->syms = malloc(sizeof(char*) * origin_env->count);
new_env->vals = malloc(sizeof(lispval*) * origin_env->count);
-
- for(int i=0;i<origin_env->count; i++){
- new_env->syms[i] = malloc(strlen(origin_env->syms[i]) + 1);
- strcpy(new_env->syms[i], origin_env->syms[i]);
- new_env->vals[i] = clone_lispval(origin_env->vals[i]);
- }
+
+ for (int i = 0; i < origin_env->count; i++) {
+ new_env->syms[i] = malloc(strlen(origin_env->syms[i]) + 1);
+ strcpy(new_env->syms[i], origin_env->syms[i]);
+ new_env->vals[i] = clone_lispval(origin_env->vals[i]);
+ }
return new_env;
}
-
// Read ast into a lispval object
lispval* lispval_append_child(lispval* parent, lispval* child)
{
@@ -729,7 +738,7 @@ lispval* builtin_def(lispval* v, lispenv* env)
print_lispval_tree(values, 0);
if (VERBOSE)
printf("\n");
- insert_in_lispenv(symbols->cell[i]->sym, values->cell[i], env);
+ insert_in_current_lispenv(symbols->cell[i]->sym, values->cell[i], env);
}
return lispval_sexpr(); // ()
}
@@ -774,7 +783,7 @@ lispval* builtin_math_ops(char* op, lispval* v, lispenv* e)
return lispval_err("Error: Non minus unary operation");
}
} else if (v->count >= 2) {
- lispval* x = clone_lispval(v->cell[0]);
+ lispval* x = clone_lispval(v->cell[0]);
for (int i = 1; i < v->count; i++) {
lispval* y = v->cell[i];
@@ -834,7 +843,7 @@ void lispenv_add_builtin(char* builtin_func_name, lispbuiltin func, lispenv* env
lispval* f = lispval_builtin_func(func, builtin_func_name);
if (VERBOSE)
print_lispval_tree(f, 0);
- insert_in_lispenv(builtin_func_name, f, env);
+ insert_in_current_lispenv(builtin_func_name, f, env);
delete_lispval(f);
}
void lispenv_add_builtins(lispenv* env)