summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2017-06-15 22:30:39 -0700
committerKaz Kylheku <kaz@kylheku.com>2017-06-15 22:30:39 -0700
commit39317da1ce84bb30b103fc580219cb4e509da281 (patch)
tree8a2710c378e37434bf48aa7d77869bfce6639f4b
parent74c61cc4ee63bbca2cf202eba531c1d388829e5b (diff)
downloadtxr-39317da1ce84bb30b103fc580219cb4e509da281.tar.gz
txr-39317da1ce84bb30b103fc580219cb4e509da281.tar.bz2
txr-39317da1ce84bb30b103fc580219cb4e509da281.zip
reverse, nreverse: do generalized sequences and carray.
* lib.c (reverse): Support COBJ via list operations, but handle carray via vector case. (nreverse): Support COBJ via vector case. This will work for carray. Fixes are needed in ref and refset to work with structs.
-rw-r--r--lib.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/lib.c b/lib.c
index ee7e8eeb..800142a2 100644
--- a/lib.c
+++ b/lib.c
@@ -1013,6 +1013,7 @@ val nreverse(val in)
return rev;
}
+ case COBJ:
case VEC:
case STR:
{
@@ -1033,11 +1034,17 @@ val nreverse(val in)
}
}
-val reverse(val in)
+val reverse(val seq_in)
{
+ val in = nullify(seq_in);
+
switch (type(in)) {
case NIL:
return nil;
+ case COBJ:
+ if (in->co.cls == carray_s)
+ goto carray;
+ /* fallthrough */
case CONS:
case LCONS:
{
@@ -1048,7 +1055,7 @@ val reverse(val in)
in = cdr(in);
}
- return rev;
+ return make_like(rev, seq_in);
}
case LSTR:
in = lazy_str_force(in);
@@ -1056,6 +1063,7 @@ val reverse(val in)
case VEC:
case STR:
case LIT:
+ carray:
{
val obj = copy(in);
cnum len = c_num(length(in));