From a31d9092201d6e9fefde7403b19ed93512aa6b47 Mon Sep 17 00:00:00 2001 From: Felix Perktold Date: Thu, 22 Jan 2026 13:42:34 +0100 Subject: lambdas now eval whole body and return the last element of the body instead of just evaluating and returnin the first element --- lisp.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) (limited to 'lisp.c') diff --git a/lisp.c b/lisp.c index 139f76f..0f43f85 100644 --- a/lisp.c +++ b/lisp.c @@ -182,11 +182,16 @@ void print_value(value *val) { break; case VT_LAMBDA: - printf("(λ "); - print_value(val->as.lambda.params); - printf(" "); - print_value(val->as.lambda.body); - printf(")"); + print_value( + cons(make_symbol("λ"), + cons(val->as.lambda.params, val->as.lambda.body) + ) + ); + //printf("(λ "); + //print_value(val->as.lambda.params); + //printf(" "); + //print_value(car(val->as.lambda.body)); + //printf(")"); break; case VT_PROCEDURE: @@ -302,7 +307,7 @@ value *eval_pair(env *e, value *v) { !strcmp(head->as.sym, "\\") || !strcmp(head->as.sym, "λ"))) { value *params = car(tail); - value *body = car(cdr(tail)); + value *body = cdr(tail); return make_lambda(e, params, body); } @@ -358,9 +363,15 @@ value *apply(value *lval, value *args) { arg = cdr(arg); } - // all lambda parameters bound to respective args + // are all lambda parameters bound to respective args? if (params->type == VT_NIL) { - value *result = eval(sub_env, lval->as.lambda.body); + value *lbody = lval->as.lambda.body; + value *result = make_nil(); + + while (lbody->type == VT_PAIR) { + result = eval(sub_env, car(lbody)); + lbody = cdr(lbody); + } // if arguments left, try applying them to evaluated lambda if (arg->type == VT_PAIR && result->type == VT_LAMBDA) { -- cgit v1.2.3