commit 21a0a4edab8bc05cb6fdc0ab91f2c1179b56dcc9
parent 0dbf97b393d0dca45c28a70a65f8655d81f320e5
Author: NunoSempere <nuno.sempere@protonmail.com>
Date: Sun, 7 May 2023 12:58:11 -0400
add clone lispenv function
Diffstat:
1 file changed, 18 insertions(+), 1 deletion(-)
diff --git a/src/mumble.c b/src/mumble.c
@@ -358,6 +358,23 @@ void insert_in_lispenv(char* sym, lispval* v, lispenv* 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]);
+ }
+ return new_env;
+}
+
+
// Read ast into a lispval object
lispval* lispval_append_child(lispval* parent, lispval* child)
{
@@ -538,7 +555,7 @@ void print_ast(mpc_ast_t* ast, int indent_level)
indent = NULL;
}
-// Lispval helpers
+// Cloners
lispval* clone_lispval(lispval* old)
{
lispval* new;