diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2013-11-29 23:15:48 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2013-11-29 23:15:48 -0800 |
commit | 65189fb5a549a4149db9a6b59bd89d2d8009b89b (patch) | |
tree | c6d0e395b6466c01d1739f2e034cd9ff2ab77f5a /lib.c | |
parent | 5cdd2fd5ff14c113b867df969779c75fca79932e (diff) | |
download | txr-65189fb5a549a4149db9a6b59bd89d2d8009b89b.tar.gz txr-65189fb5a549a4149db9a6b59bd89d2d8009b89b.tar.bz2 txr-65189fb5a549a4149db9a6b59bd89d2d8009b89b.zip |
* eval.c (eval_init): New functions countqual, countql, countq
and count_if registered as intrinsics.
* lib.c (countqual, countql, countq, count_if): New functions.
* lib.h (countqual, countql, countq, count_if): Declared.
* txr.1: New functions documented.
Diffstat (limited to 'lib.c')
-rw-r--r-- | lib.c | 51 |
1 files changed, 51 insertions, 0 deletions
@@ -783,6 +783,57 @@ val tree_find(val obj, val tree, val testfun) return nil; } +val countqual(val obj, val list) +{ + val count = zero; + + for (; list; list = cdr(list)) + if (equal(car(list), obj)) + count = plus(count, one); + + return count; +} + +val countql(val obj, val list) +{ + val count = zero; + + for (; list; list = cdr(list)) + if (eql(car(list), obj)) + count = plus(count, one); + + return count; +} + +val countq(val obj, val list) +{ + val count = zero; + + for (; list; list = cdr(list)) + if (eq(car(list), obj)) + count = plus(count, one); + + return count; +} + +val count_if(val pred, val list, val key) +{ + val count = zero; + + if (!key) + key = identity_f; + + for (; list; list = cdr(list)) { + val subj = funcall1(key, car(list)); + val satisfies = funcall1(pred, subj); + + if (satisfies) + count = plus(count, one); + } + + return count; +} + val some_satisfy(val list, val pred, val key) { if (!key) |