diff options
| -rw-r--r-- | lisp.c | 17 | ||||
| -rw-r--r-- | lisp.h | 2 | ||||
| -rw-r--r-- | lisp.y | 6 | ||||
| -rw-r--r-- | main.c | 2 |
4 files changed, 17 insertions, 10 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); } @@ -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); @@ -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 @@ -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); } |
