mumble

A Lisp written in C, following the *Build Your Own Lisp* book
Log | Files | Refs | README

commit 21a0a4edab8bc05cb6fdc0ab91f2c1179b56dcc9
parent 0dbf97b393d0dca45c28a70a65f8655d81f320e5
Author: NunoSempere <nuno.sempere@protonmail.com>
Date:   Sun,  7 May 2023 12:58:11 -0400

add clone lispenv function

Diffstat:
Msrc/mumble.c | 19++++++++++++++++++-
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;