From 93696d97d468b5b0519d03c01169d08af65e8909 Mon Sep 17 00:00:00 2001 From: NunoSempere Date: Sun, 7 May 2023 14:11:19 -0400 Subject: [PATCH] feat: add and document user-defined functions! --- README.md | 6 ++++++ mumble | Bin 125200 -> 125232 bytes src/mumble.c | 59 +++++++++++++++++++++++++++++++++++++-------------- 3 files changed, 49 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index aa8ef68..161052a 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,12 @@ mumble> / a b c mumble> VERBOSITY=0 mumble> VERBOSITY=1 mumble> VERBOSITY=2 +mumble> def { {plus} {(@ {x y} {+ x y})} } +( ) +mumble> plus +( @ { x y } { + x y } ) +mumble> eval {plus 1 2} +3.000000 ``` diff --git a/mumble b/mumble index 0313917694899debb1320ce3ddc865adb3223a8d..d50aabb99f08f99214f1f790e76f9745863244a4 100755 GIT binary patch delta 37226 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 b!74W>k$H}*7pnVdv3nLTda1P^$(8;OiK{>- delta 34332 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 TpRQbB#gH6c^iVqgEqnbx$$IkD diff --git a/src/mumble.c b/src/mumble.c index cc40b17..29e90f5 100644 --- a/src/mumble.c +++ b/src/mumble.c @@ -226,17 +226,17 @@ void delete_lispval(lispval* v) if (VERBOSE) printfln("Freeing user-defined func"); if (v->env != NULL) { - destroy_lispenv(v->env); + // destroy_lispenv(v->env); free(v->env); v->env = NULL; } if (v->variables != NULL) { - delete_lispval(v->variables); + // delete_lispval(v->variables); free(v->variables); v->variables = NULL; } if (v->manipulation != NULL) { - delete_lispval(v->manipulation); + // delete_lispval(v->manipulation); free(v->manipulation); v->manipulation = NULL; } @@ -334,6 +334,8 @@ lispval* get_from_lispenv(char* sym, lispenv* env) if (env->parent != NULL) { return get_from_lispenv(sym, env->parent); } else { + if (VERBOSE) + printfln("Unbound symbol %s", sym); return lispval_err("Error: unbound symbol"); } // and this explains shadowing! @@ -460,6 +462,14 @@ lispval* read_lispval(mpc_ast_t* t) } // Print +void print_env(lispenv* env) +{ + printfln("Environment: "); + for (int i = 0; i < env->count; i++) { + printfln("Value for symbol %s: ", env->syms[i]); + print_lispval_tree(env->vals[i], 2); + } +} void print_lispval_tree(lispval* v, int indent_level) { char* indent = malloc(sizeof(char) * (indent_level + 1)); @@ -729,7 +739,7 @@ lispval* builtin_def(lispval* v, lispenv* env) LISPVAL_ASSERT(source->type == LISPVAL_QEXPR, "Error: Argument passed to def is not a q-expr, i.e., a bracketed list."); LISPVAL_ASSERT(source->count == 2, "Error: Argument passed to def should be a q expr with two q expressions as children: def { { a b } { 1 2 } } "); LISPVAL_ASSERT(source->cell[0]->type == LISPVAL_QEXPR, "Error: Argument passed to def should be a q expr with two q expressions as children: def { { a b } { 1 2 } } "); - LISPVAL_ASSERT(source->cell[1]->type == LISPVAL_QEXPR, "Error: Argument passed to def should be a q expr with two q expressions as children: def { { a b } { 1 2 } } "); + LISPVAL_ASSERT(source->cell[1]->type == LISPVAL_QEXPR || source->cell[1]->type == LISPVAL_SEXPR, "Error: Argument passed to def should be a q expr with two q expressions as children: def { { a b } { 1 2 } } "); LISPVAL_ASSERT(source->cell[0]->count == source->cell[1]->count, "Error: In function \"def\" both subarguments should have the same length"); lispval* symbols = source->cell[0]; @@ -930,7 +940,7 @@ lispval* evaluate_lispval(lispval* l, lispenv* env) // Check if the first element is an operation. if (VERBOSE) - printfln("Checking is first element is a function"); + printfln("Checking if first element is a function"); if (l->count >= 2 && ((l->cell[0])->type == LISPVAL_BUILTIN_FUNC)) { if (VERBOSE) @@ -943,8 +953,10 @@ lispval* evaluate_lispval(lispval* l, lispenv* env) // Ok, do this properly now. if (VERBOSE) printfln("Constructing function and operands"); + lispval* f = clone_lispval(l->cell[0]); lispval* operands = lispval_sexpr(); + for (int i = 1; i < l->count; i++) { lispval_append_child(operands, l->cell[i]); } @@ -966,22 +978,37 @@ lispval* evaluate_lispval(lispval* l, lispenv* env) } if (l->count >= 2 && ((l->cell[0])->type == LISPVAL_USER_FUNC)) { - // Do something with user-defined functions here + if (VERBOSE) + printfln("Evaluating user-defined function"); + lispval* f = clone_lispval(l->cell[0]); + f->env->parent = env; - // check whether function takes as many arguments as given LISPVAL_ASSERT(f->variables->count == (l->count - 1), "Error: Incorrect number of variables given to user-defined function"); + if (VERBOSE) + printfln("Number of variables match"); - for (int i = 1; i < l->count; i++) { - // lispval_append_child(operands, l->cell[i]); - insert_in_current_lispenv( - f->variables->cell[i]->sym, l->cell[i], f->env); + if (VERBOSE) { + printfln("Function vars:"); + print_lispval_tree(f->variables, 2); + printfln("Function manipulation:"); + print_lispval_tree(f->manipulation, 2); } - lispval* answer = evaluate_lispval(f->manipulation, f->env); - destroy_lispenv(f->env); - return answer; - // return lispval_err("Error: User-defined functions not yet implemented"); + for (int i = 0; i < f->variables->count; i++) { + insert_in_current_lispenv(f->variables->cell[i]->sym, l->cell[i + 1], f->env); + } + if (VERBOSE) { + printfln("User defined function environment: "); + print_env(f->env); + } + lispval* temp = clone_lispval(f->manipulation); + temp->type = LISPVAL_SEXPR; + lispval* answer = evaluate_lispval(temp, f->env); + // lispval* answer = builtin_eval(f->manipulation, f->env); + // destroy_lispenv(f->env); + return answer; + return lispval_err("Error: User-defined functions not yet implemented"); } return l; @@ -1099,7 +1126,7 @@ int main(int argc, char** argv) } delete_lispval(answer); if (VERBOSE > 1) - printfln("variable \"answer\" after deletion: %p", answer); + printfln("variable \"answer\" after deletion: %p ", answer); // delete_lispval(answer); // do this twice, just to see. //if(VERBOSE) printfln("Deleting this lispval:"); // if(VERBOSE) print_lispval_tree(l,2);