diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2016-09-15 06:39:11 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2016-09-15 06:39:11 -0700 |
commit | a3c8effa1337c16e9c7832bf1fb4e66f72e5c3c8 (patch) | |
tree | 56a215529f5185cf38ea456b879bc9710bd4f115 /lib.c | |
parent | d6f725293fdfd7d28ab5938256866b1fd3b49fe1 (diff) | |
download | txr-a3c8effa1337c16e9c7832bf1fb4e66f72e5c3c8.tar.gz txr-a3c8effa1337c16e9c7832bf1fb4e66f72e5c3c8.tar.bz2 txr-a3c8effa1337c16e9c7832bf1fb4e66f72e5c3c8.zip |
New keepq, keepql and keepqual functions.
* eval.c (eval_init): Register keepq, keepql and keepqual
intrinsic functions.
* lib.c (keepq, keepql, keepqual): New functions.
* lib.h (keepq, keepql, keepqual): Declared.
Diffstat (limited to 'lib.c')
-rw-r--r-- | lib.c | 61 |
1 files changed, 61 insertions, 0 deletions
@@ -1554,6 +1554,67 @@ val remove_if(val pred, val list_orig, val key) return make_like(out, list_orig); } +val keepq(val obj, val list_orig, val key) +{ + list_collect_decl (out, ptail); + val list = tolist(list_orig); + val lastmatch = cons(nil, list); + + key = default_arg(key, identity_f); + + gc_hint(list); + + for (; list; list = cdr(list)) { + if (funcall1(key, car(list)) != obj) { + ptail = list_collect_nconc(ptail, ldiff(cdr(lastmatch), list)); + lastmatch = list; + } + } + ptail = list_collect_nconc(ptail, cdr(lastmatch)); + return make_like(out, list_orig); +} + +val keepql(val obj, val list_orig, val key) +{ + list_collect_decl (out, ptail); + val list = tolist(list_orig); + val lastmatch = cons(nil, list); + + key = default_arg(key, identity_f); + + gc_hint(list); + + for (; list; list = cdr(list)) { + if (!eql(funcall1(key, car(list)), obj)) { + ptail = list_collect_nconc(ptail, ldiff(cdr(lastmatch), list)); + ptail = list_collect_nconc(ptail, ldiff(cdr(lastmatch), list)); + lastmatch = list; + } + } + ptail = list_collect_nconc(ptail, cdr(lastmatch)); + return make_like(out, list_orig); +} + +val keepqual(val obj, val list_orig, val key) +{ + list_collect_decl (out, ptail); + val list = tolist(list_orig); + val lastmatch = cons(nil, list); + + key = default_arg(key, identity_f); + + gc_hint(list); + + for (; list; list = cdr(list)) { + if (!equal(funcall1(key, car(list)), obj)) { + ptail = list_collect_nconc(ptail, ldiff(cdr(lastmatch), list)); + lastmatch = list; + } + } + ptail = list_collect_nconc(ptail, cdr(lastmatch)); + return make_like(out, list_orig); +} + val keep_if(val pred, val list_orig, val key) { list_collect_decl (out, ptail); |