(loop for e in list
maximizing e into max
minimizing e into min
finally (return (values min max)))
In one pass, find the largest number and
the smallest number.
Even better: in one pass, find the smallest number,
the largest number, the sum, and the product.
(multi-reduce min max + * '(3 2 9 8 4 5 6 7))
2
9
44
362880
Given:
(define (multi-fold* funcs knils the-list)
(let loop ((the-list the-list)
(accums knils))
(if (null? the-list)
(apply values accums)
(loop (cdr the-list)
(map (lambda (fn acc) (fn (car the-list) acc))
funcs
accums)))))
(define (multi-fold . args)
(let ((rev (reverse args)))
(multi-fold* (reverse (cddr rev)) (cadr rev) (car rev))))
(define (multi-reduce* funcs the-list)
(multi-fold* funcs (map (lambda _ (car the-list)) funcs) (cdr the-list)))
(define (multi-reduce . args)
(let ((rev (reverse args)))
(multi-reduce* (reverse (cdr rev)) (car rev))))
--- SoupGate-Win32 v1.05
* Origin: fsxNet Usenet Gateway (21:1/5)