summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2024-03-10 21:36:01 -0700
committerKaz Kylheku <kaz@kylheku.com>2024-03-10 21:36:01 -0700
commitfebb0ede7ef5a687011c059b8b9b7812fac77f08 (patch)
treee2039fe229a2d664299c73538cf74f6cccc681bd
parent1582b7c2e3ffa988805994f1a8af98d6145dd3ec (diff)
downloadtxr-febb0ede7ef5a687011c059b8b9b7812fac77f08.tar.gz
txr-febb0ede7ef5a687011c059b8b9b7812fac77f08.tar.bz2
txr-febb0ede7ef5a687011c059b8b9b7812fac77f08.zip
append, nconc; replace implementation with seq_build.
* lib.c (seq_append2, seq_appendv, seq_nconc2, seq_nconcv): New functions. (append2, appendv, nappend2, nconcv): Now implemented using new functions. * lib.h (seq_append2, seq_appendv, seq_nconc2, seq_nconcv): Declared.
-rw-r--r--lib.c106
-rw-r--r--lib.h4
2 files changed, 82 insertions, 28 deletions
diff --git a/lib.c b/lib.c
index f925f917..12f024cc 100644
--- a/lib.c
+++ b/lib.c
@@ -1647,6 +1647,80 @@ val seq_finish(seq_build_t *bu)
return bu->obj;
}
+val seq_append2(val self, val seq0, val seq1)
+{
+ seq_build_t bu;
+
+ seq_build_init(self, &bu, seq0);
+
+ seq_pend(&bu, seq0);
+ seq_pend(&bu, seq1);
+
+ return seq_finish(&bu);
+}
+
+val seq_appendv(val self, varg seqs)
+{
+ cnum index = 0;
+ val seq0;
+ seq_build_t bu;
+
+ if (!args_more(seqs, index))
+ return nil;
+
+ seq0 = args_get(seqs, &index);
+
+ if (!args_more(seqs, index))
+ return seq0;
+
+ seq_build_init(self, &bu, seq0);
+
+ seq_pend(&bu, seq0);
+
+ do
+ seq_pend(&bu, args_get(seqs, &index));
+ while (args_more(seqs, index));
+
+ return seq_finish(&bu);
+}
+
+val seq_nconc2(val self, val seq0, val seq1)
+{
+ seq_build_t bu;
+
+ seq_build_init(self, &bu, seq0);
+
+ seq_nconc(&bu, seq0);
+ seq_nconc(&bu, seq1);
+
+ return seq_finish(&bu);
+}
+
+val seq_nconcv(val self, varg seqs)
+{
+ cnum index = 0;
+ val seq0;
+ seq_build_t bu;
+
+ if (!args_more(seqs, index))
+ return nil;
+
+ seq0 = args_get(seqs, &index);
+
+ if (!args_more(seqs, index))
+ return seq0;
+
+ seq_build_init(self, &bu, seq0);
+
+ seq_nconc(&bu, seq0);
+
+ do
+ seq_nconc(&bu, args_get(seqs, &index));
+ while (args_more(seqs, index));
+
+ return seq_finish(&bu);
+}
+
val throw_mismatch(val self, val obj, type_t t)
{
type_mismatch(lit("~a: ~s is not of type ~s"), self, obj, code2type(t), nao);
@@ -2677,25 +2751,12 @@ val us_nreverse(val in)
val append2(val list1, val list2)
{
- list_collect_decl (out, ptail);
-
- ptail = list_collect_append (ptail, list1);
- ptail = list_collect_append (ptail, list2);
-
- return out;
+ return seq_append2(lit("append"), list1, list2);
}
val appendv(varg lists)
{
- cnum index = 0;
- list_collect_decl (out, ptail);
-
- while (args_more(lists, index)) {
- val item = args_get(lists, &index);
- ptail = list_collect_append(ptail, item);
- }
-
- return out;
+ return seq_appendv(lit("append"), lists);
}
static val appendl(val lists)
@@ -2706,12 +2767,7 @@ static val appendl(val lists)
val nappend2(val list1, val list2)
{
- list_collect_decl (out, ptail);
-
- ptail = list_collect_nconc (ptail, list1);
- ptail = list_collect_nconc (ptail, list2);
-
- return out;
+ return seq_nconc2(lit("nconc"), list1, list2);
}
val revappend(val list1, val list2)
@@ -2736,13 +2792,7 @@ val nreconc(val list1, val list2)
val nconcv(varg lists)
{
- cnum index = 0;
- list_collect_decl (out, ptail);
-
- while (args_more(lists, index))
- ptail = list_collect_nconc(ptail, args_get(lists, &index));
-
- return out;
+ return seq_nconcv(lit("nconc"), lists);
}
val sub_list(val list, val from, val to)
diff --git a/lib.h b/lib.h
index 69b7ea97..b4b1df87 100644
--- a/lib.h
+++ b/lib.h
@@ -771,6 +771,10 @@ void seq_add(seq_build_t *bu, val item);
void seq_pend(seq_build_t *bu, val items);
void seq_nconc(seq_build_t *bu, val items);
val seq_finish(seq_build_t *bu);
+val seq_append2(val self, val seq0, val seq1);
+val seq_appendv(val self, varg seqs);
+val seq_nconc2(val self, val seq0, val seq1);
+val seq_nconcv(val self, varg seqs);
NORETURN val throw_mismatch(val self, val obj, type_t);
INLINE val type_check(val self, val obj, type_t typecode)
{