diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2023-07-10 23:31:04 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2023-07-10 23:31:04 -0700 |
commit | 93707b7aa65a7050950bc9d0729f319e59f13dbf (patch) | |
tree | c638dd4a7a6ce4d4223d48a4827ff4ca7cc81dff | |
parent | a011544efd7e826e1bd07cce0cdf52ab7be245f2 (diff) | |
download | txr-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.c | 37 | ||||
-rw-r--r-- | txr.1 | 2 |
2 files changed, 14 insertions, 25 deletions
@@ -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)) @@ -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 |