summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2020-07-08 07:36:25 -0700
committerKaz Kylheku <kaz@kylheku.com>2020-07-08 07:36:25 -0700
commit2c2fe9fc598e6677e9b16372b65c477c5ba6d03b (patch)
tree590c017d9ac8650ccb05f979be0bc06a7f031d8b /lib.c
parentfa3c90eb3ac48abd8bb9065884fe15523a864766 (diff)
downloadtxr-2c2fe9fc598e6677e9b16372b65c477c5ba6d03b.tar.gz
txr-2c2fe9fc598e6677e9b16372b65c477c5ba6d03b.tar.bz2
txr-2c2fe9fc598e6677e9b16372b65c477c5ba6d03b.zip
list_seq: return lazy list, not eager.
* lib.c (list_seq_func): New static function. (list_seq): Convert to lazy processing. The iterator is threaded through the lazy cons's car field, so we don't have to mutate the function's environment. * txr.1: Added note about list-seq producing a lazy list.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/lib.c b/lib.c
index a42dbbba..dc0b7161 100644
--- a/lib.c
+++ b/lib.c
@@ -1669,18 +1669,28 @@ val iterable(val obj)
return seq_iterable(si);
}
+static val list_seq_func(val lcons)
+{
+ val iter = us_car(lcons);
+ val item = iter_item(iter);
+ val new_iter = iter_step(iter);
+
+ us_rplaca(lcons, item);
+
+ if (iter_more(new_iter))
+ us_rplacd(lcons, make_lazy_cons_car(us_lcons_fun(lcons), new_iter));
+
+ return nil;
+}
+
val list_seq(val seq)
{
- val self = lit("list-seq");
- seq_iter_t iter;
- val elem;
- seq_iter_init(self, &iter, seq);
- list_collect_decl (out, ptail);
+ val iter = iter_begin(seq);
- while (seq_get(&iter, &elem))
- ptail = list_collect(ptail, elem);
+ if (iter_more(iter))
+ return make_lazy_cons_car(func_n1(list_seq_func), iter);
- return out;
+ return nil;
}
val vec_seq(val seq)