From f49b0fd2b449ad6a82a627dcab0c6afaded6ab32 Mon Sep 17 00:00:00 2001 From: NunoSempere Date: Sun, 7 May 2023 13:28:34 -0400 Subject: [PATCH] add function evaluation? attempt 1 --- README.md | 7 +++++++ mumble | Bin 125176 -> 125200 bytes src/mumble.c | 20 +++++++++++++++++++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b69d5a1..aa8ef68 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,13 @@ This is a Lisp written in C. It follows the outline in this [Build Your Own Lisp - Different and perhaps slightly more elegant printing functions - A slightly different approach to evaluating functions - Capturing Ctrl+D +- Float instead of ints + +Conversely, it doesn't have: +- Function currying +- strings +- Variable arguments +- ... Overall this might be mostly of interest as a pointer to the book that this is originally based on. And to readers of that same book, I'd be curious to see what you ended up with. diff --git a/mumble b/mumble index 0126ff02656e0dfe13e4fb50fefddc75e4a487cd..0313917694899debb1320ce3ddc865adb3223a8d 100755 GIT binary patch delta 34544 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 l^b!0{&atqT-U}klk=Xm#uK^R{{b%EcaQ)8 diff --git a/src/mumble.c b/src/mumble.c index bcae435..cc40b17 100644 --- a/src/mumble.c +++ b/src/mumble.c @@ -167,6 +167,7 @@ lispval* lispval_qexpr(void) // Destructor void print_lispval_tree(lispval* v, int indent_level); +void destroy_lispenv(lispenv* env); void delete_lispval(lispval* v) { if (v == NULL || v->type > LARGEST_LISPVAL) @@ -225,14 +226,17 @@ void delete_lispval(lispval* v) if (VERBOSE) printfln("Freeing user-defined func"); if (v->env != NULL) { + destroy_lispenv(v->env); free(v->env); v->env = NULL; } if (v->variables != NULL) { + delete_lispval(v->variables); free(v->variables); v->variables = NULL; } if (v->manipulation != NULL) { + delete_lispval(v->manipulation); free(v->manipulation); v->manipulation = NULL; } @@ -963,7 +967,21 @@ 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 - return lispval_err("Error: User-defined functions not yet implemented"); + lispval* f = clone_lispval(l->cell[0]); + + // 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"); + + 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); + } + lispval* answer = evaluate_lispval(f->manipulation, f->env); + destroy_lispenv(f->env); + return answer; + + // return lispval_err("Error: User-defined functions not yet implemented"); } return l;