diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2021-06-08 07:46:05 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2021-06-08 07:46:05 -0700 |
commit | f791ed11cf3a801990f26a0ed7c0455c05df59df (patch) | |
tree | c18cea3da5d53fcf2421577ab9f9dce7774d8f8d /lib.c | |
parent | 5b2f81b1c492c61c8046b46f271d6125a83d19b7 (diff) | |
download | txr-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.c | 34 |
1 files changed, 34 insertions, 0 deletions
@@ -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"); |