diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2021-12-22 07:13:33 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2021-12-22 07:13:33 -0800 |
commit | 638293d5281db1276a3b64f2eb969ad99c0ee9f3 (patch) | |
tree | b9d369af312ea49431b89ae2da96a5e9e9f3e82f /lib.c | |
parent | 75b1508c61d3805d1678a8dabf8d48b9e76c8d37 (diff) | |
download | txr-638293d5281db1276a3b64f2eb969ad99c0ee9f3.tar.gz txr-638293d5281db1276a3b64f2eb969ad99c0ee9f3.tar.bz2 txr-638293d5281db1276a3b64f2eb969ad99c0ee9f3.zip |
New functions: subq, subql, subqual and subst.
* eval.c (eval_init): Register new intrinsics.
* lib.c, lib.h (subq, subql, subqual, subst): New functions.
* tests/012/seq.tl: New test cases.
* stdlib/optimize.tl (subst): Function removed. The new subst
drop-in replaces this one.
* txr.1: Documented.
* stdlib/doc-syms.tl: Updated.
Diffstat (limited to 'lib.c')
-rw-r--r-- | lib.c | 33 |
1 files changed, 33 insertions, 0 deletions
@@ -11487,6 +11487,39 @@ val pos_min(val seq, val testfun, val keyfun) return pos_max(seq, default_arg(testfun, less_f), keyfun); } +val subq(val oldv, val newv, val seq) +{ + return subst(oldv, newv, seq, eq_f, identity_f); +} + +val subql(val oldv, val newv, val seq) +{ + return subst(oldv, newv, seq, eql_f, identity_f); +} + +val subqual(val oldv, val newv, val seq) +{ + return subst(oldv, newv, seq, equal_f, identity_f); +} + +val subst(val oldv, val newv, val seq, val testfun_in, val keyfun_in) +{ + val self = lit("subst"); + seq_iter_t iter; + seq_iter_init(self, &iter, seq); + val elem; + val testfun = default_arg(testfun_in, equal_f); + val keyfun = default_arg(keyfun_in, identity_f); + list_collect_decl (out, ptail); + + while (seq_get(&iter, &elem)) { + val key = funcall1(keyfun, elem); + ptail = list_collect(ptail, if3(funcall2(testfun, oldv, key), newv, elem)); + } + + return make_like(out, seq); +} + val mismatch(val left, val right, val testfun_in, val keyfun_in) { val testfun = default_arg(testfun_in, equal_f); |