summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2021-06-08 07:46:05 -0700
committerKaz Kylheku <kaz@kylheku.com>2021-06-08 07:46:05 -0700
commitf791ed11cf3a801990f26a0ed7c0455c05df59df (patch)
treec18cea3da5d53fcf2421577ab9f9dce7774d8f8d /lib.c
parent5b2f81b1c492c61c8046b46f271d6125a83d19b7 (diff)
downloadtxr-f791ed11cf3a801990f26a0ed7c0455c05df59df.tar.gz
txr-f791ed11cf3a801990f26a0ed7c0455c05df59df.tar.bz2
txr-f791ed11cf3a801990f26a0ed7c0455c05df59df.zip
lib: new function, fill-vec.
* eval.c (eval_init): Register fill-vec intrinsic. * lib.c (fill_vec): New function. * lib.h (fill_vec): Declared. * tests/010/vec.tl: New file. * txr.1: Documented. * share/txr/stdlib/doc-syms.tl: Updated.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/lib.c b/lib.c
index ae78b147..9e3827d7 100644
--- a/lib.c
+++ b/lib.c
@@ -8661,6 +8661,40 @@ val replace_obj(val obj, val items, val from, val to)
return obj;
}
+val fill_vec(val vec, val item, val from_in, val to_in)
+{
+ val self = lit("fill-vec");
+ val len = length_vec(vec);
+ cnum from = c_num(default_arg(from_in, zero), self);
+ cnum to = c_num(default_arg(to_in, len), self);
+ cnum l = c_num(len, self);
+ cnum i;
+
+ if (from < 0)
+ from += l;
+
+ if (to < 0)
+ to += l;
+
+ if (from < 0 || from > l)
+ uw_throwf(error_s, lit("~a: from index ~s is out of range for vector ~s"),
+ self, num(from), vec, nao);
+
+ if (to < 0 || to > l)
+ uw_throwf(error_s, lit("~a: to index ~s is out of range for vector ~s"),
+ self, num(to), vec, nao);
+
+ if (from >= to)
+ return vec;
+
+ for (i = from; i < to - 1; i++)
+ vec->v.vec[i] = item;
+
+ set(mkloc(vec->v.vec[i], vec), item);
+
+ return vec;
+}
+
val cat_vec(val list)
{
val self = lit("cat-vec");