summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--lib.c10
2 files changed, 13 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 82eae34c..e2f0f93b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2012-01-19 Kaz Kylheku <kaz@kylheku.com>
+
+ * lib.c (car_l, cdr_l): Bugfix: do not call the lazy cons
+ force function if it is already nil, and set it to nil afterward.
+
2012-01-12 Kaz Kylheku <kaz@kylheku.com>
* eval.c (eval_init): Make lazy_appendv function
diff --git a/lib.c b/lib.c
index 70324341..a05ead7e 100644
--- a/lib.c
+++ b/lib.c
@@ -246,7 +246,10 @@ val *car_l(val cons)
case CONS:
return &cons->c.car;
case LCONS:
- funcall1(cons->lc.func, cons);
+ if (cons->lc.func) {
+ funcall1(cons->lc.func, cons);
+ cons->lc.func = nil;
+ }
return &cons->lc.car;
default:
type_mismatch(lit("~s is not a cons"), cons, nao);
@@ -259,7 +262,10 @@ val *cdr_l(val cons)
case CONS:
return &cons->c.cdr;
case LCONS:
- funcall1(cons->lc.func, cons);
+ if (cons->lc.func) {
+ funcall1(cons->lc.func, cons);
+ cons->lc.func = nil;
+ }
return &cons->lc.cdr;
default:
type_mismatch(lit("~s is not a cons"), cons, nao);