diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2016-09-14 06:08:09 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2016-09-14 06:08:09 -0700 |
commit | 5e79435c47c6d25310be92b412abed8670e5a8ff (patch) | |
tree | 02366dc8b5443bd02e8e9a44602833aaf0bbec24 /lib.c | |
parent | 8e1a3e36d17788a59903db7ea865bbac8553b56a (diff) | |
download | txr-5e79435c47c6d25310be92b412abed8670e5a8ff.tar.gz txr-5e79435c47c6d25310be92b412abed8670e5a8ff.tar.bz2 txr-5e79435c47c6d25310be92b412abed8670e5a8ff.zip |
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.
Diffstat (limited to 'lib.c')
-rw-r--r-- | lib.c | 29 |
1 files changed, 10 insertions, 19 deletions
@@ -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)) { |