From 77df6486f9ed77e38a554cdaa6e28bea348f4788 Mon Sep 17 00:00:00 2001 From: Felix Perktold Date: Wed, 21 Jan 2026 17:12:58 +0100 Subject: add primitive lazy-eval (STILL BROKEN!) --- modules/std_lib.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'modules') diff --git a/modules/std_lib.c b/modules/std_lib.c index f87f2db..a38c5ff 100644 --- a/modules/std_lib.c +++ b/modules/std_lib.c @@ -22,6 +22,7 @@ value *procedure_reverse(env *e, value *args) { value *procedure_isnull(env *e, value *args) { value *v = eval(e, car(args)); + v = force_thunk(v); if(v->type == VT_NIL) { return make_int(1); } @@ -29,6 +30,8 @@ value *procedure_isnull(env *e, value *args) { } int value_eq(value *a, value *b) { + a = force_thunk(a); + b = force_thunk(b); if(a->type != b->type){ return 0; } @@ -54,10 +57,12 @@ int value_eq(value *a, value *b) { value *procedure_equal(env *e, value *args) { value *v_prev = eval(e, car(args)); + v_prev = force_thunk(v_prev); args = cdr(args); while (args->type == VT_PAIR) { value *v_cur = eval(e, car(args)); + v_cur = force_thunk(v_cur); if (!value_eq(v_prev, v_cur)) { return make_nil(); } @@ -71,6 +76,7 @@ value *procedure_equal(env *e, value *args) { value *apply_to_nums(env *e, value *args, double (*fn)(double, double)) { double result; value *v = eval(e, car(args)); + v = force_thunk(v); if (v->type == VT_INT) { result = v->as.i; } else if (v->type == VT_DOUBLE) { @@ -125,6 +131,7 @@ value *procedure_div(env *e, value *args) { value *procedure_lt(env *e, value *args) { double prev_num; value *v = eval(e, car(args)); + v = force_thunk(v); if (v->type == VT_INT) { prev_num = v->as.i; -- cgit v1.2.3