diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2020-07-08 07:36:25 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2020-07-08 07:36:25 -0700 |
commit | 2c2fe9fc598e6677e9b16372b65c477c5ba6d03b (patch) | |
tree | 590c017d9ac8650ccb05f979be0bc06a7f031d8b /lib.c | |
parent | fa3c90eb3ac48abd8bb9065884fe15523a864766 (diff) | |
download | txr-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.c | 26 |
1 files changed, 18 insertions, 8 deletions
@@ -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) |