summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2021-12-22 07:13:33 -0800
committerKaz Kylheku <kaz@kylheku.com>2021-12-22 07:13:33 -0800
commit638293d5281db1276a3b64f2eb969ad99c0ee9f3 (patch)
treeb9d369af312ea49431b89ae2da96a5e9e9f3e82f /lib.c
parent75b1508c61d3805d1678a8dabf8d48b9e76c8d37 (diff)
downloadtxr-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.c33
1 files changed, 33 insertions, 0 deletions
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);