From 638293d5281db1276a3b64f2eb969ad99c0ee9f3 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Wed, 22 Dec 2021 07:13:33 -0800 Subject: 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. --- lib.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'lib.c') diff --git a/lib.c b/lib.c index 79ad82a0..cce37b3a 100644 --- a/lib.c +++ b/lib.c @@ -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); -- cgit v1.2.3