summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2023-07-10 23:31:04 -0700
committerKaz Kylheku <kaz@kylheku.com>2023-07-10 23:31:04 -0700
commit93707b7aa65a7050950bc9d0729f319e59f13dbf (patch)
treec638dd4a7a6ce4d4223d48a4827ff4ca7cc81dff
parenta011544efd7e826e1bd07cce0cdf52ab7be245f2 (diff)
downloadtxr-93707b7aa65a7050950bc9d0729f319e59f13dbf.tar.gz
txr-93707b7aa65a7050950bc9d0729f319e59f13dbf.tar.bz2
txr-93707b7aa65a7050950bc9d0729f319e59f13dbf.zip
group-reduce: use sequence iteration.
* hash.c (group_reduce): Use seq_iter_t instead of obsolete vector and list iteration. * txr.1: Use 1..11 range in one group-reduce example instead of (range 1 10).
-rw-r--r--hash.c37
-rw-r--r--txr.12
2 files changed, 14 insertions, 25 deletions
diff --git a/hash.c b/hash.c
index cfd4826c..d17260f2 100644
--- a/hash.c
+++ b/hash.c
@@ -1792,34 +1792,23 @@ val group_reduce(val hash, val by_fun, val reduce_fun, val seq,
val initval, val filter_fun)
{
val self = lit("group-reduce");
- initval = default_null_arg(initval);
+ seq_iter_t iter;
+ val elem;
- if (vectorp(seq)) {
- cnum i, len;
+ initval = default_null_arg(initval);
- for (i = 0, len = c_fixnum(length(seq), self); i < len; i++) {
- val v = vecref(seq, num_fast(i));
- val key = funcall1(by_fun, v);
- val new_p;
- loc pcdr = gethash_l(self, hash, key, mkcloc(new_p));
+ seq_iter_init(self, &iter, seq);
- if (new_p)
- set(pcdr, funcall2(reduce_fun, initval, v));
- else
- set(pcdr, funcall2(reduce_fun, deref(pcdr), v));
- }
- } else {
- for (; seq; seq = cdr(seq)) {
- val v = car(seq);
- val key = funcall1(by_fun, v);
- val new_p;
- loc pcdr = gethash_l(self, hash, key, mkcloc(new_p));
+ while (seq_get(&iter, &elem))
+ {
+ val key = funcall1(by_fun, elem);
+ val new_p;
+ loc pcdr = gethash_l(self, hash, key, mkcloc(new_p));
- if (new_p)
- set(pcdr, funcall2(reduce_fun, initval, v));
- else
- set(pcdr, funcall2(reduce_fun, deref(pcdr), v));
- }
+ if (new_p)
+ set(pcdr, funcall2(reduce_fun, initval, elem));
+ else
+ set(pcdr, funcall2(reduce_fun, deref(pcdr), elem));
}
if (!null_or_missing_p(filter_fun))
diff --git a/txr.1 b/txr.1
index e6a1e1c1..954d04fa 100644
--- a/txr.1
+++ b/txr.1
@@ -56180,7 +56180,7 @@ Frequency histogram:
Separate the integers 1\(en10 into even and odd, and sum these groups:
.verb
- [group-reduce (hash) evenp + (range 1 10) 0]
+ [group-reduce (hash) evenp + 1..11 0]
-> #H(() (t 30) (nil 25))
.brev