add clone lispenv function
This commit is contained in:
parent
0dbf97b393
commit
21a0a4edab
19
src/mumble.c
19
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;
|
||||
|
|
Loading…
Reference in New Issue
Block a user