summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2016-09-15 06:48:11 -0700
committerKaz Kylheku <kaz@kylheku.com>2016-09-15 06:48:11 -0700
commit5a09b244c77dbf498a4bdf7a9381d2741ce87055 (patch)
tree19c02de1d17eb709ec77b8458c7c679fc705b562 /lib.c
parenta3c8effa1337c16e9c7832bf1fb4e66f72e5c3c8 (diff)
downloadtxr-5a09b244c77dbf498a4bdf7a9381d2741ce87055.tar.gz
txr-5a09b244c77dbf498a4bdf7a9381d2741ce87055.tar.bz2
txr-5a09b244c77dbf498a4bdf7a9381d2741ce87055.zip
key function argument on remq, remql and remqual.
* eval.c (weave_while): Pass third arg to remq as nil. (eval_init): Update registrations of remq, remql and remqual. * lib.c (remq, remql, remqual): Implement key function argument. * lib.h (remq, remql, remqual): Declarations updated. * sysif.c (at_exit_call): Pass third arg to remq as nil. * debug.c (debug): Pass third argument to remqual as nil. * txr.1: Documentation updated.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/lib.c b/lib.c
index 0134d477..7abdb95b 100644
--- a/lib.c
+++ b/lib.c
@@ -1476,17 +1476,21 @@ val rmember_if(val pred, val list, val key)
return found;
}
-val remq(val obj, val list_orig)
+val remq(val obj, val list_orig, val keyfun)
{
list_collect_decl (out, ptail);
val list = tolist(list_orig);
val lastmatch = cons(nil, list);
+ keyfun = default_bool_arg(keyfun);
gc_hint(list);
for (; list; list = cdr(list)) {
- if (car(list) == obj) {
+ val elem = car(list);
+ val key = keyfun ? funcall1(keyfun, elem) : elem;
+
+ if (key == obj) {
ptail = list_collect_nconc(ptail, ldiff(cdr(lastmatch), list));
lastmatch = list;
}
@@ -1495,16 +1499,21 @@ val remq(val obj, val list_orig)
return make_like(out, list_orig);
}
-val remql(val obj, val list_orig)
+val remql(val obj, val list_orig, val keyfun)
{
list_collect_decl (out, ptail);
val list = tolist(list_orig);
val lastmatch = cons(nil, list);
+ keyfun = default_bool_arg(keyfun);
+
gc_hint(list);
for (; list; list = cdr(list)) {
- if (eql(car(list), obj)) {
+ val elem = car(list);
+ val key = keyfun ? funcall1(keyfun, elem) : elem;
+
+ if (eql(key, obj)) {
ptail = list_collect_nconc(ptail, ldiff(cdr(lastmatch), list));
lastmatch = list;
}
@@ -1513,16 +1522,21 @@ val remql(val obj, val list_orig)
return make_like(out, list_orig);
}
-val remqual(val obj, val list_orig)
+val remqual(val obj, val list_orig, val keyfun)
{
list_collect_decl (out, ptail);
val list = tolist(list_orig);
val lastmatch = cons(nil, list);
+ keyfun = default_bool_arg(keyfun);
+
gc_hint(list);
for (; list; list = cdr(list)) {
- if (equal(car(list), obj)) {
+ val elem = car(list);
+ val key = keyfun ? funcall1(keyfun, elem) : elem;
+
+ if (equal(key, obj)) {
ptail = list_collect_nconc(ptail, ldiff(cdr(lastmatch), list));
lastmatch = list;
}