summaryrefslogtreecommitdiff
path: root/modules/std_lib.c
diff options
context:
space:
mode:
authorFelix Perktold <Felix.Perktold@student.uibk.ac.at>2026-01-21 19:48:47 +0100
committerFelix Perktold <Felix.Perktold@student.uibk.ac.at>2026-01-21 19:48:47 +0100
commite3b8eded6cf924e2f1e532f0db1aef899b451ccf (patch)
treea7a1098eeac676aaed58d0013d40c3a8aa0c88e4 /modules/std_lib.c
parent77df6486f9ed77e38a554cdaa6e28bea348f4788 (diff)
fix integers-from style infinite lists
Diffstat (limited to 'modules/std_lib.c')
-rw-r--r--modules/std_lib.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/modules/std_lib.c b/modules/std_lib.c
index a38c5ff..858d34c 100644
--- a/modules/std_lib.c
+++ b/modules/std_lib.c
@@ -5,15 +5,23 @@
value *procedure_cons(env *e, value *args) {
value *v = eval(e, car(args));
- return cons(v, eval(e, car(cdr(args))));
+ return cons(v, make_thunk(e, car(cdr(args))));
}
value *procedure_car(env *e, value *args) {
- return car(eval(e, car(args)));
+ value *v = eval(e, car(args));
+ while (v->type == VT_THUNK) {
+ v = force_thunk(v);
+ }
+ return car(v);
}
value *procedure_cdr(env *e, value *args) {
- return cdr(eval(e, car(args)));
+ value *v = eval(e, car(args));
+ while (v->type == VT_THUNK) {
+ v = force_thunk(v);
+ }
+ return cdr(v);
}
value *procedure_reverse(env *e, value *args) {