From 10083ef8d5be31db094ce70d0021d23aecdb9249 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sat, 14 Apr 2012 21:50:12 -0700 Subject: * eval.c (eval_init): find-if intrinsic registered. * lib.c (find): First and second arguments reversed. The item should be first. (find_if): New function. * lib.h (find): Declaration updated. (find_if): Declaration added. * txr.1: Stub section. --- ChangeLog | 13 +++++++++++++ eval.c | 1 + lib.c | 31 ++++++++++++++++++++++++++----- lib.h | 1 + txr.1 | 2 +- 5 files changed, 42 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 46374ede..d8fda790 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2012-04-14 Kaz Kylheku + + * eval.c (eval_init): find-if intrinsic registered. + + * lib.c (find): First and second arguments reversed. + The item should be first. + (find_if): New function. + + * lib.h (find): Declaration updated. + (find_if): Declaration added. + + * txr.1: Stub section. + 2012-04-14 Kaz Kylheku * HACKING: Added notes on generational garbage collection. diff --git a/eval.c b/eval.c index aab58a61..3cacebb5 100644 --- a/eval.c +++ b/eval.c @@ -2374,6 +2374,7 @@ void eval_init(void) reg_fun(intern(lit("merge"), user_package), func_n4o(merge, 2)); reg_fun(intern(lit("sort"), user_package), func_n3o(sort, 2)); reg_fun(intern(lit("find"), user_package), func_n4o(find, 2)); + reg_fun(intern(lit("find-if"), user_package), func_n3o(find_if, 2)); reg_fun(intern(lit("set-diff"), user_package), func_n4o(set_diff, 2)); reg_fun(intern(lit("length"), user_package), func_n1(length)); diff --git a/lib.c b/lib.c index 7e42361a..704c0bd0 100644 --- a/lib.c +++ b/lib.c @@ -3944,21 +3944,42 @@ val sort(val seq, val lessfun, val keyfun) return seq; } -val find(val list, val key, val testfun, val keyfun) +val find(val item, val list, val testfun, val keyfun) { - uses_or2; + if (!keyfun) + keyfun = identity_f; + + if (!testfun) + testfun = equal_f; + + for (; list; list = cdr(list)) { + val elem = car(list); + val key = funcall1(keyfun, elem); + + if (funcall2(testfun, item, key)) + return elem; + } + + return nil; +} + +val find_if(val pred, val list, val key) +{ + if (!key) + key = identity_f; for (; list; list = cdr(list)) { val item = car(list); - val list_key = funcall1(or2(keyfun, identity_f), item); + val subj = funcall1(key, item); - if (funcall2(or2(testfun, equal_f), key, list_key)) + if (funcall1(pred, subj)) return item; } return nil; } + val set_diff(val list1, val list2, val testfun, val keyfun) { list_collect_decl (out, ptail); @@ -3978,7 +3999,7 @@ val set_diff(val list1, val list2, val testfun, val keyfun) val item = car(list1); val list1_key = funcall1(keyfun, item); - if (!find(list2, list1_key, testfun, keyfun)) + if (!find(list1_key, list2, testfun, keyfun)) list_collect (ptail, item); } } diff --git a/lib.h b/lib.h index e6c72b1e..ed500b40 100644 --- a/lib.h +++ b/lib.h @@ -631,6 +631,7 @@ val mappend(val fun, val list); val merge(val list1, val list2, val lessfun, val keyfun); val sort(val seq, val lessfun, val keyfun); val find(val list, val key, val testfun, val keyfun); +val find_if(val pred, val list, val key); val set_diff(val list1, val list2, val testfun, val keyfun); val length(val seq); val sub(val seq, val from, val to); diff --git a/txr.1 b/txr.1 index 487e10da..6a84a6be 100644 --- a/txr.1 +++ b/txr.1 @@ -7564,7 +7564,7 @@ Examples: .SS Function sort -.SS Function find +.SS Functions find and find-if .SS Function set-diff -- cgit v1.2.3