| Deutsch English Français Italiano |
|
<v7e1rf$321ib$1@dont-email.me> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!weretis.net!feeder8.news.weretis.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: "B. Pym" <Nobody447095@here-nor-there.org>
Newsgroups: comp.lang.lisp
Subject: Re: map and reduce
Date: Fri, 19 Jul 2024 15:48:02 -0000 (UTC)
Organization: A noiseless patient Spider
Lines: 54
Message-ID: <v7e1rf$321ib$1@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Injection-Date: Fri, 19 Jul 2024 17:48:03 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="adff5a388ff6d0ae53c744bdb00d17f0";
logging-data="3212875"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18U3nPu+TY4zvPkpJzbedSf"
User-Agent: XanaNews/1.18.1.6
Cancel-Lock: sha1:WrXsORZW1DpUpMEDYFLx6eKbGbo=
Bytes: 2301
> > Consider n vectors (or lists) v1, ..., vn of equal length, an n-
> > variate function f, and a bivariate function g.
> >
> > I want to calculate (reduce g (map 'vector f v1 v2 ... vn)), eg
> >
> > (reduce #'+ (map 'vector #'* '(1 2 3) '(4 5 6))) ; => 32
> >
> > but without the intermediate vector (my vectors are long). I can of
> > course write a function to do this, but I am wondering if there is a
> > clever way to do it with CL library functions.
>
> I don't think there is a way to do this sort of thing directly. It's
> not difficult (or even particularly ugly) to do using LOOP, though. For
> the case G = #'+, it's particularly nice:
>
> (loop for x across first-vector
> for y across second-vector
> sum (funcall f x y))
That cannot handle any number of vectors.
>
> but for general G, you need
>
> (loop for x across first-vector
> for y across second-vector
> for temp = (funcall f x y)
> for result = temp then (funcall result temp)
Wrong. Try (funcall G result temp)
> finally (return result))
Gauche Scheme
(use srfi-43) ;; vector ops.
(define (vec-map-reduce red-func seed map-func . vectors)
(apply vector-fold
(lambda (i accum . elements)
(red-func accum (reduce map-func #f elements)))
seed
vectors))
(vec-map-reduce + 0 *
#(9 2 3 4)
#(5 6 7 8)
#(20 22 23 24))
===>
2415