diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2020-06-28 08:48:20 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2020-06-28 08:48:20 -0700 |
commit | dbcfe10c3a9dc881e1f157582c01074fc60623f4 (patch) | |
tree | 20ea4d2c453e68104c625b67d63f24d79ca01610 /lib.c | |
parent | 0197d1dc1c43b808bfbe641ef702b10128fbdc9d (diff) | |
download | txr-dbcfe10c3a9dc881e1f157582c01074fc60623f4.tar.gz txr-dbcfe10c3a9dc881e1f157582c01074fc60623f4.tar.bz2 txr-dbcfe10c3a9dc881e1f157582c01074fc60623f4.zip |
New functions: list-seq, ved-seq and str-seq.
These functions convert any iterable to a list, vector or
string.
* eval.c (eval_init): Registered list-seq, vec-seq and str-seq
intrinsics.
* lib.c (list_seq, vec_seq, str_seq): New functions.
* lib.h (list_seq, vec_seq, str_seq): Declared.
* txr.1: Documented.
Diffstat (limited to 'lib.c')
-rw-r--r-- | lib.c | 46 |
1 files changed, 46 insertions, 0 deletions
@@ -1486,6 +1486,52 @@ val seqp(val obj) return tnil(si.kind != SEQ_NOTSEQ); } +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); + + while (seq_get(&iter, &elem)) + ptail = list_collect(ptail, elem); + + return out; +} + +val vec_seq(val seq) +{ + val self = lit("vec-seq"); + seq_iter_t iter; + val elem; + val vec = vector(zero, nil); + seq_iter_init(self, &iter, seq); + + while (seq_get(&iter, &elem)) + vec_push(vec, elem); + + return vec; +} + +val str_seq(val seq) +{ + val self = lit("str-seq"); + seq_iter_t iter; + val elem; + val str = mkustring(zero); + seq_iter_init(self, &iter, seq); + + while (seq_get(&iter, &elem)) { + if (chrp(elem) || stringp(elem)) + string_extend(str, elem); + else + unsup_obj(self, elem); + } + + return str; +} + loc list_collect(loc ptail, val obj) { val items = cons(obj, nil); |