summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog13
-rw-r--r--eval.c1
-rw-r--r--lib.c31
-rw-r--r--lib.h1
-rw-r--r--txr.12
5 files changed, 42 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 46374ede..d8fda790 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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>
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