summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2020-06-28 08:48:20 -0700
committerKaz Kylheku <kaz@kylheku.com>2020-06-28 08:48:20 -0700
commitdbcfe10c3a9dc881e1f157582c01074fc60623f4 (patch)
tree20ea4d2c453e68104c625b67d63f24d79ca01610 /lib.c
parent0197d1dc1c43b808bfbe641ef702b10128fbdc9d (diff)
downloadtxr-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.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/lib.c b/lib.c
index c2180abb..040294b5 100644
--- a/lib.c
+++ b/lib.c
@@ -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);