diff options
| author | Felix Perktold <Felix.Perktold@student.uibk.ac.at> | 2025-12-21 23:28:15 +0100 |
|---|---|---|
| committer | Felix Perktold <Felix.Perktold@student.uibk.ac.at> | 2025-12-21 23:28:15 +0100 |
| commit | 33b3d80c2dcd12dbf692984e0d736bfa9906a8b5 (patch) | |
| tree | 6808f532ce6af3674a27b2e1250c348fd8742f73 /lisp.c | |
| parent | 85e9fef4aa8855b6660ce8c8cc8d6f5fb0d507b6 (diff) | |
fix bug in apply, improve printing
Diffstat (limited to 'lisp.c')
| -rw-r--r-- | lisp.c | 17 |
1 files changed, 11 insertions, 6 deletions
@@ -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); } |
