diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2020-05-05 06:44:36 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2020-05-05 06:44:36 -0700 |
commit | 36367a299dbd409f3f30df3eab7f7e94cdb1da83 (patch) | |
tree | 8173fbd18c46dd0230980ed3602dba88c45bd2e8 /lib.c | |
parent | 17b63a8c27d1185eaf7acc7fc46500d8ea9f818e (diff) | |
download | txr-36367a299dbd409f3f30df3eab7f7e94cdb1da83.tar.gz txr-36367a299dbd409f3f30df3eab7f7e94cdb1da83.tar.bz2 txr-36367a299dbd409f3f30df3eab7f7e94cdb1da83.zip |
lib: convert counting and predicate quantifying to seq_info.
* lib.c (countqual, countql, countq, count_if, some_satisfy,
all_satisfy, none_satisfy): Convert from list iteration to
seq_info.
Diffstat (limited to 'lib.c')
-rw-r--r-- | lib.c | 153 |
1 files changed, 88 insertions, 65 deletions
@@ -2127,116 +2127,139 @@ val tree_find(val obj, val tree, val testfun) return nil; } -val countqual(val obj, val list) +val countqual(val obj, val seq) { - val count = zero; + val self = lit("countqual"); + seq_iter_t iter; + ucnum count = 0; + val ocount = zero; + val elem; - list = nullify(list); + seq_iter_init(self, &iter, z(seq)); - gc_hint(list); + while (seq_get(&iter, &elem)) + if (equal(elem, obj)) + if (++count == 0) + ocount = plus(ocount, one); - for (; list; list = cdr(list)) - if (equal(car(list), obj)) - count = plus(count, one); - - return count; + return if3(ocount == zero, + unum(count), + plus(unum(count), ash(ocount, num_fast(CHAR_BIT * sizeof count)))); } -val countql(val obj, val list) +val countql(val obj, val seq) { - val count = zero; + val self = lit("countql"); + seq_iter_t iter; + ucnum count = 0; + val ocount = zero; + val elem; - list = nullify(list); + seq_iter_init(self, &iter, z(seq)); - gc_hint(list); - - for (; list; list = cdr(list)) - if (eql(car(list), obj)) - count = plus(count, one); + while (seq_get(&iter, &elem)) + if (eql(elem, obj)) + if (++count == 0) + ocount = plus(ocount, one); - return count; + return if3(ocount == zero, + unum(count), + plus(unum(count), ash(ocount, num_fast(CHAR_BIT * sizeof count)))); } -val countq(val obj, val list) +val countq(val obj, val seq) { - val count = zero; - - list = nullify(list); + val self = lit("countq"); + seq_iter_t iter; + ucnum count = 0; + val ocount = zero; + val elem; - gc_hint(list); + seq_iter_init(self, &iter, z(seq)); - for (; list; list = cdr(list)) - if (car(list) == obj) - count = plus(count, one); + while (seq_get(&iter, &elem)) + if (elem == obj) + if (++count == 0) + ocount = plus(ocount, one); - return count; + return if3(ocount == zero, + unum(count), + plus(unum(count), ash(ocount, num_fast(CHAR_BIT * sizeof count)))); } -val count_if(val pred, val list, val key) +val count_if(val pred, val seq, val key_in) { - val count = zero; + val self = lit("count-if"); + seq_iter_t iter; + ucnum count = 0; + val ocount = zero; + val key = default_arg(key_in, identity_f); + val elem; - key = default_arg(key, identity_f); - list = nullify(list); - - gc_hint(list); - - for (; list; list = cdr(list)) { - val subj = funcall1(key, car(list)); - val satisfies = funcall1(pred, subj); + seq_iter_init(self, &iter, z(seq)); - if (satisfies) - count = plus(count, one); + while (seq_get(&iter, &elem)) { + val subj = funcall1(key, elem); + if (funcall1(pred, subj)) + if (++count == 0) + ocount = plus(ocount, one); } - return count; + return if3(ocount == zero, + unum(count), + plus(unum(count), ash(ocount, num_fast(CHAR_BIT * sizeof count)))); } -val some_satisfy(val list, val pred, val key) +val some_satisfy(val seq, val pred_in, val key_in) { - pred = default_arg(pred, identity_f); - key = default_arg(key, identity_f); - list = nullify(list); + val pred = default_arg(pred_in, identity_f); + val key = default_arg(key_in, identity_f); + val self = lit("some"); + seq_iter_t iter; + val elem; - gc_hint(list); + seq_iter_init(self, &iter, z(seq)); - for (; list; list = cdr(list)) { - val item; - if ((item = funcall1(pred, funcall1(key, car(list)))) != nil) + while (seq_get(&iter, &elem)) { + val item = funcall1(pred, funcall1(key, elem)); + if (item != nil) return item; } return nil; } -val all_satisfy(val list, val pred, val key) +val all_satisfy(val seq, val pred_in, val key_in) { - val item = t; - - pred = default_arg(pred, identity_f); - key = default_arg(key, identity_f); - list = nullify(list); + val pred = default_arg(pred_in, identity_f); + val key = default_arg(key_in, identity_f); + val self = lit("some"); + seq_iter_t iter; + val elem; + val ret = t; - gc_hint(list); + seq_iter_init(self, &iter, z(seq)); - for (; list; list = cdr(list)) { - if ((item = funcall1(pred, funcall1(key, car(list)))) == nil) + while (seq_get(&iter, &elem)) { + if ((ret = funcall1(pred, funcall1(key, elem))) == nil) return nil; } - return item; + return ret; } -val none_satisfy(val list, val pred, val key) +val none_satisfy(val seq, val pred_in, val key_in) { - pred = default_arg(pred, identity_f); - key = default_arg(key, identity_f); - list = nullify(list); + val pred = default_arg(pred_in, identity_f); + val key = default_arg(key_in, identity_f); + val self = lit("none"); + seq_iter_t iter; + val elem; - gc_hint(list); + seq_iter_init(self, &iter, z(seq)); - for (; list; list = cdr(list)) { - if (funcall1(pred, funcall1(key, car(list)))) + while (seq_get(&iter, &elem)) { + if (funcall1(pred, funcall1(key, elem))) return nil; } |