diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2019-08-14 19:50:55 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2019-08-14 19:50:55 -0700 |
commit | 70ee17726d2c419c049ad87098e61a73bcd14766 (patch) | |
tree | a8f68c065c8d5e838e7be4bb3e1a2726a402eec0 | |
parent | fbde5f19a487037dc35bda1a1221d81a44d80687 (diff) | |
download | txr-70ee17726d2c419c049ad87098e61a73bcd14766.tar.gz txr-70ee17726d2c419c049ad87098e61a73bcd14766.tar.bz2 txr-70ee17726d2c419c049ad87098e61a73bcd14766.zip |
where: bugfix: doesn't work for non-list sequence.
* lib.c (lazy_where_func, where): We have a regression here
due to strangely trying to smuggle the predicate function in
si->inf.obj, which cannot possibly work other than for lists
whose seq iterators ignore that field. We switch to the trick
of using the cdr field of the lazy cons to carry that forward.
-rw-r--r-- | lib.c | 20 |
1 files changed, 7 insertions, 13 deletions
@@ -10459,22 +10459,21 @@ val rsearch(val seq, val key, val testfun, val keyfun) static val lazy_where_func(val seq_iter, val lcons) { struct seq_iter *si = coerce(struct seq_iter *, seq_iter->co.handle); - val index = succ(us_car(lcons)); - val func = si->inf.obj; + us_cons_bind (index, func, lcons); for (;;) { val item; if (!si->get(si, &item)) { - si->inf.obj = nil; + us_rplacd(lcons, nil); return nil; } + index = succ(index); if (funcall1(func, item)) break; - index = succ(index); } { - us_rplacd(lcons, make_lazy_cons_car(lcons_fun(lcons), index)); + us_rplacd(lcons, make_lazy_cons_car_cdr(lcons_fun(lcons), index, func)); return nil; } } @@ -10511,20 +10510,15 @@ val where(val func, val seq) for (;;) { val item; - if (!si->get(si, &item)) { - si->inf.obj = nil; + if (!si->get(si, &item)) return nil; - } if (funcall1(func, item)) break; index = succ(index); } - { - val cell = make_lazy_cons_car(func_f1(seq_iter, lazy_where_func), index); - si->inf.obj = func; - return cell; - } + return make_lazy_cons_car_cdr(func_f1(seq_iter, lazy_where_func), + index, func); } else { val hash_iter = hash_begin(seq); val key; |