diff options
-rw-r--r-- | eval.c | 3 | ||||
-rw-r--r-- | lib.c | 46 | ||||
-rw-r--r-- | lib.h | 3 | ||||
-rw-r--r-- | txr.1 | 29 |
4 files changed, 81 insertions, 0 deletions
@@ -6926,6 +6926,9 @@ void eval_init(void) reg_fun(intern(lit("uni"), user_package), func_n4o(uni, 2)); reg_fun(intern(lit("seqp"), user_package), func_n1(seqp)); + reg_fun(intern(lit("list-seq"), user_package), func_n1(list_seq)); + reg_fun(intern(lit("vec-seq"), user_package), func_n1(vec_seq)); + reg_fun(intern(lit("str-seq"), user_package), func_n1(str_seq)); reg_fun(intern(lit("length"), user_package), length_f); reg_fun(intern(lit("len"), user_package), length_f); reg_fun(intern(lit("empty"), user_package), func_n1(empty)); @@ -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); @@ -620,6 +620,9 @@ val tolist(val seq); val nullify(val obj); val empty(val seq); val seqp(val obj); +val list_seq(val seq); +val vec_seq(val seq); +val str_seq(val seq); val nreverse(val in); val reverse(val in); val us_nreverse(val in); @@ -29227,6 +29227,35 @@ then convert the resulting list to the same type as an input value by using .codn make-like . +.coNP Functions @, list-seq @ vec-seq and @ str-seq +.synb +.mets (list-seq << iterable ) +.mets (vec-seq << iterable ) +.mets (str-seq << iterable ) +.syne +.desc +The +.codn list-seq , +.code vec-seq +and +.code str-seq +functions convert an iterable object of any type into a list, vector +or string, respectively. + +The +.code list-seq +and +.code vec-seq +iterate the items of +.meta iterable +and accumulate these items into a new list or vector. + +The +.code str-seq +similarly iterates the items of +.metn iterable , +requiring them to be a mixture of characters and strings. + .coNP Functions @ length and @ len .synb .mets (length << iterable ) |