From 33b3d80c2dcd12dbf692984e0d736bfa9906a8b5 Mon Sep 17 00:00:00 2001 From: Felix Perktold Date: Sun, 21 Dec 2025 23:28:15 +0100 Subject: fix bug in apply, improve printing --- lisp.c | 17 +++++++++++------ lisp.h | 2 +- lisp.y | 6 ++++-- main.c | 2 +- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/lisp.c b/lisp.c index 22e90b5..da0a5f6 100644 --- a/lisp.c +++ b/lisp.c @@ -265,21 +265,26 @@ value *eval_pair(env *e, value *v) { } if (head_eval->type == VT_LAMBDA) { - return apply(head_eval, tail); + return apply(e, head_eval, tail); } return v; } -value *apply(value *lval, value *args) { - env *sub_env = env_create(lval->as.lambda.env); +value *apply(env *e, value *lval, value *args) { + env *sub_env = env_create(e); value *params = lval->as.lambda.params; value *arg = args; while (params->type == VT_PAIR && arg->type == VT_PAIR) { - env_define(sub_env, - car(params)->as.sym, - eval(lval->as.lambda.env, car(arg))); + if (car(params)->type != VT_SYMBOL) { + printf("not a symbol: "); + println_value(car(params)); + return make_nil(); + } + + value *arg_eval = eval(e, car(arg)); + env_define(sub_env, car(params)->as.sym, arg_eval); params = cdr(params); arg = cdr(arg); } diff --git a/lisp.h b/lisp.h index 2e95fb9..5abdfd4 100644 --- a/lisp.h +++ b/lisp.h @@ -68,7 +68,7 @@ extern env *global_env; value *eval(env *e, value *val); value *eval_pair(env *e, value *val); -value *apply(value *lambda, value *args); +value *apply(env *e, value *lambda, value *args); value *builtin_cons(env *e, value *args); value *builtin_car(env *e, value *args); diff --git a/lisp.y b/lisp.y index 734bfa2..ffb9bf9 100644 --- a/lisp.y +++ b/lisp.y @@ -25,13 +25,15 @@ int yyerror(const char *s); %% sexprs: sexpr { + value *v = eval(global_env, $1); printf(";> "); - println_value(eval(global_env, $1)); + println_value(v); } | sexprs sexpr { + value *v = eval(global_env, $2); printf(";> "); - println_value(eval(global_env, $2)); + println_value(v); }; sexpr: atom diff --git a/main.c b/main.c index f297402..563d98a 100644 --- a/main.c +++ b/main.c @@ -23,7 +23,7 @@ int main(void) { env_define(global_env, "<=", make_builtin(builtin_le)); // START REPL char* line; - while ((line = readline("λ > ")) != NULL) { + while ((line = readline("λ> ")) != NULL) { if (*line) { add_history(line); } -- cgit v1.2.3