diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2017-06-15 22:30:39 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2017-06-15 22:30:39 -0700 |
commit | 39317da1ce84bb30b103fc580219cb4e509da281 (patch) | |
tree | 8a2710c378e37434bf48aa7d77869bfce6639f4b | |
parent | 74c61cc4ee63bbca2cf202eba531c1d388829e5b (diff) | |
download | txr-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.c | 12 |
1 files changed, 10 insertions, 2 deletions
@@ -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)); |