summaryrefslogtreecommitdiff
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
parent77df6486f9ed77e38a554cdaa6e28bea348f4788 (diff)
fix integers-from style infinite lists
-rw-r--r--lisp.c27
-rw-r--r--modules/std_lib.c14
2 files changed, 20 insertions, 21 deletions
diff --git a/lisp.c b/lisp.c
index cbb54ed..324eeb6 100644
--- a/lisp.c
+++ b/lisp.c
@@ -91,16 +91,8 @@ value *force_thunk(value *v) {
return v;
}
if(v->as.thunk.cached) {
- printf("\nDEBUG: thunk ");
- print_value(v->as.thunk.expr);
- printf(" was already cached as: ");
- println_value(v->as.thunk.cached);
return v->as.thunk.cached;
}
- printf("\nDEBUG: thunk ");
- print_value(v->as.thunk.expr);
- printf(" is now cached as: ");
- println_value(v->as.thunk.cached);
v->as.thunk.cached = eval(v->as.thunk.env, v->as.thunk.expr);
return v;
@@ -169,22 +161,21 @@ void print_value(value *val) {
break;
case VT_PAIR:
- // DOTTED:
- //printf("(");
- //print_value(val->as.pair.car);
- //printf(" . ");
- //print_value(val->as.pair.cdr);
- //printf(")");
-
- // LISTS:
printf("(");
- print_value(car(val));
+ print_value(force_thunk(car(val)));
value *p_cdr = cdr(val);
- while (p_cdr->type == VT_PAIR) {
+ while (p_cdr->type == VT_PAIR || p_cdr->type == VT_THUNK) {
+ while (p_cdr->type == VT_THUNK) {
+ p_cdr = force_thunk(p_cdr);
+ }
+ if (p_cdr->type != VT_PAIR) {
+ break;
+ }
printf(" ");
print_value(car(p_cdr));
p_cdr = cdr(p_cdr);
}
+
if(p_cdr->type != VT_NIL) {
printf(" . ");
print_value(p_cdr);
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) {