Sujet : Re: Loopy
De : No_spamming (at) *nospam* noWhere_7073.org (B. Pym)
Groupes : comp.lang.lispDate : 13. Jun 2024, 05:13:11
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <v4do46$22q3g$1@dont-email.me>
References : 1 2
User-Agent : XanaNews/1.18.1.6
On 6/10/2024, B. Pym wrote:
Peter Seibel wrote:
> (loop for x across array-of-numbers
> minimizing x into min
> maximizing x into max
> summing x into total
> counting t into count
> finally (return (list min max (/ total count))))
In Gauche Scheme, it's a one-liner.
(use gauche.sequence)
(define v #(0 2 -3 99 48 35 86 27 50 18))
(define count (vector-length v))
`(,(find-min v) ,(find-max v) ,(/ (fold + 0 v) count))
===>
(-3 99 181/5)
Another way.
(define v #(0 2 -3 99 48 35 86 27 50 18))
(define count (vector-length v))
(let ((r (mul-vec-reduce (list + max min) v)))
(reverse (cons (/ (pop! r) count) r)))
===>
(-3 99 181/5)
Given:
(use srfi-43) ;; vector-fold
(define (mul-vec-reduce konses vec)
(let ((len (length konses)))
(vector-fold
(lambda (i accum x)
(if (null? accum)
(make-list len x)
(map
(lambda (f a b) (f a b))
konses
(make-list len x)
accum)))
'()
vec)))