diff options
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | eval.c | 1 | ||||
-rw-r--r-- | lib.c | 31 | ||||
-rw-r--r-- | lib.h | 1 | ||||
-rw-r--r-- | txr.1 | 2 |
5 files changed, 42 insertions, 6 deletions
@@ -1,5 +1,18 @@ 2012-04-14 Kaz Kylheku <kaz@kylheku.com> + * 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 <kaz@kylheku.com> + * HACKING: Added notes on generational garbage collection. 2012-04-14 Kaz Kylheku <kaz@kylheku.com> @@ -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)); @@ -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); } } @@ -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); @@ -7564,7 +7564,7 @@ Examples: .SS Function sort -.SS Function find +.SS Functions find and find-if .SS Function set-diff |