From c73f52bb02c93bdf0fec6bf111abb0d4802a6cae Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Wed, 14 Sep 2016 06:08:09 -0700 Subject: Fix broken keep/remove functions. * lib.c (remq, remql, remqual, remove_if, keep_if): Bug: functions don't work correctly for strings. Anyway, the ldiff-based algorithm is ugly on vectors and strings. Patching things upp by converting input to list with tolist. --- lib.c | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/lib.c b/lib.c index 5ca640c5..1ed27766 100644 --- a/lib.c +++ b/lib.c @@ -1476,13 +1476,12 @@ val rmember_if(val pred, val list, val key) return found; } -val remq(val obj, val list) +val remq(val obj, val list_orig) { list_collect_decl (out, ptail); - val list_orig = list; + val list = tolist(list_orig); val lastmatch = cons(nil, list); - list = nullify(list); gc_hint(list); @@ -1496,14 +1495,12 @@ val remq(val obj, val list) return make_like(out, list_orig); } -val remql(val obj, val list) +val remql(val obj, val list_orig) { list_collect_decl (out, ptail); - val list_orig = list; + val list = tolist(list_orig); val lastmatch = cons(nil, list); - list = nullify(list); - gc_hint(list); for (; list; list = cdr(list)) { @@ -1516,14 +1513,12 @@ val remql(val obj, val list) return make_like(out, list_orig); } -val remqual(val obj, val list) +val remqual(val obj, val list_orig) { list_collect_decl (out, ptail); - val list_orig = list; + val list = tolist(list_orig); val lastmatch = cons(nil, list); - list = nullify(list); - gc_hint(list); for (; list; list = cdr(list)) { @@ -1536,16 +1531,14 @@ val remqual(val obj, val list) return make_like(out, list_orig); } -val remove_if(val pred, val list, val key) +val remove_if(val pred, val list_orig, val key) { list_collect_decl (out, ptail); - val list_orig = list; + val list = tolist(list_orig); val lastmatch = cons(nil, list); key = default_arg(key, identity_f); - list = nullify(list); - gc_hint(list); for (; list; list = cdr(list)) { @@ -1561,16 +1554,14 @@ val remove_if(val pred, val list, val key) return make_like(out, list_orig); } -val keep_if(val pred, val list, val key) +val keep_if(val pred, val list_orig, val key) { list_collect_decl (out, ptail); - val list_orig = list; + val list = tolist(list_orig); val lastmatch = cons(nil, list); key = default_arg(key, identity_f); - list = nullify(list); - gc_hint(list); for (; list; list = cdr(list)) { -- cgit v1.2.3