From 91d683a1b819a5b720b9eb11f8409dff9c7883e1 Mon Sep 17 00:00:00 2001 From: Felix Perktold Date: Mon, 22 Dec 2025 13:06:02 +0100 Subject: tweaks --- lisp.c | 22 +++++++++++----------- lisp.h | 2 +- main.c | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/lisp.c b/lisp.c index 5f5a6fb..b880eb3 100644 --- a/lisp.c +++ b/lisp.c @@ -69,19 +69,19 @@ value *cons(value *car, value *cdr) { } value *car(value *cons) { - if (cons->type == VT_PAIR) { + if (cons && cons->type == VT_PAIR) { return cons->as.pair.car; } - printf("not a pair: "); + printf("car of non-pair: "); println_value(cons); return make_nil(); } value *cdr(value *cons) { - if (cons->type == VT_PAIR) { + if (cons && cons->type == VT_PAIR) { return cons->as.pair.cdr; } - printf("not a pair: "); + printf("cdr of non-pair: "); println_value(cons); return make_nil(); } @@ -194,9 +194,9 @@ value *eval(env *e, value *v) { //printf("evaluating: "); //print_value(v); //printf("\n"); - - if (v->type == VT_NIL) { - return v; + + if (!v || v->type == VT_NIL) { + return make_nil(); } if (v->type == VT_PAIR) { @@ -231,7 +231,7 @@ value *eval_pair(env *e, value *v) { if (defname->type != VT_SYMBOL) { printf("error, expected symbol, found: "); println_value(defname); - return v; + return make_nil(); } env_define(e, defname->as.sym, defval); return defval; @@ -275,7 +275,7 @@ value *eval_pair(env *e, value *v) { } value *apply(env *e, value *lval, value *args) { - env *sub_env = env_create(e); + env *sub_env = env_create(lval->as.lambda.env); value *params = lval->as.lambda.params; value *arg = args; @@ -409,7 +409,7 @@ value *builtin_div(env *e, value *args) { return apply_to_nums(e, args, div_fn); } -value *builtin_le(env *e, value *args) { +value *builtin_lt(env *e, value *args) { double prev_num; value *v = eval(e, car(args)); @@ -436,7 +436,7 @@ value *builtin_le(env *e, value *args) { println_value(v); return make_nil(); } - if(prev_num > cur_num) { + if(prev_num >= cur_num) { return make_nil(); } prev_num = cur_num; diff --git a/lisp.h b/lisp.h index 7c9dd79..162da09 100644 --- a/lisp.h +++ b/lisp.h @@ -79,7 +79,7 @@ value *builtin_add(env *e, value *args); value *builtin_sub(env *e, value *args); value *builtin_mul(env *e, value *args); value *builtin_div(env *e, value *args); -value *builtin_le(env *e, value *args); +value *builtin_lt(env *e, value *args); int is_integer(double x); diff --git a/main.c b/main.c index 4f00b5d..2d258af 100644 --- a/main.c +++ b/main.c @@ -37,7 +37,7 @@ int main(int argc, char **argv) { env_define(global_env, "-", make_builtin(builtin_sub)); env_define(global_env, "*", make_builtin(builtin_mul)); env_define(global_env, "/", make_builtin(builtin_div)); - env_define(global_env, "<=", make_builtin(builtin_le)); + env_define(global_env, "<", make_builtin(builtin_lt)); // evaluate files for(int i = 1; i < argc; i++) { -- cgit v1.2.3