summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2017-06-11 11:03:40 -0700
committerKaz Kylheku <kaz@kylheku.com>2017-06-11 11:03:40 -0700
commit0687743dcfad79dba202b4411a5b51f6954cf3b2 (patch)
tree870fa9b01025fc28c5171c55fb1bb62278ee390e /lib.c
parent05e9ac4bd7a26c6c5b5979efca64260f7d38970c (diff)
downloadtxr-0687743dcfad79dba202b4411a5b51f6954cf3b2.tar.gz
txr-0687743dcfad79dba202b4411a5b51f6954cf3b2.tar.bz2
txr-0687743dcfad79dba202b4411a5b51f6954cf3b2.zip
ffi: support sel operation on carray.
Thus (select ca '(0 3 4 ...)) works and so does the sytnax [ca '(0 3 4 ...)]. This is inefficiently implemented. The selected elements are extracted to a list which is then converted to a carray of the same kind agan. * ffi.c (carray_list): New function. (ffi_init): Register carray-list intrinsic. * ffi.h (carray_list): Declared. * lib.c (make_like): Add carray case, so we can turn a list into a carray based on an example carray. This uses carray_list, with the type pulled from the original carray. The target isn't null terminated. (sel): Handle carray via vector case. * txr.1: Document changes in select and make-like.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/lib.c b/lib.c
index 95016a33..6e14e618 100644
--- a/lib.c
+++ b/lib.c
@@ -718,6 +718,8 @@ val make_like(val list, val thatobj)
if (from_list_meth)
return funcall1(from_list_meth, list);
}
+ if (thatobj->co.cls == carray_s)
+ return carray_list(list, carray_type(thatobj), nil);
break;
case NIL:
case CONS:
@@ -9633,6 +9635,8 @@ val sel(val seq_in, val where_in)
return newhash;
}
+ if (seq->co.cls == carray_s)
+ goto carray;
/* fallthrough */
case CONS:
case LCONS:
@@ -9650,6 +9654,7 @@ val sel(val seq_in, val where_in)
}
}
break;
+ carray:
default:
{
val len = length(seq);