Rocksolid Light

News from da outaworlds

mail  files  register  groups  login

Message-ID:  

question = ( to ) ? be : ! be; -- Wm. Shakespeare


comp / comp.lang.lisp / Re: summing in a loop and iterate

SubjectAuthor
o Re: summing in a loop and iterateB. Pym

1
Subject: Re: summing in a loop and iterate
From: B. Pym
Newsgroups: comp.lang.lisp
Organization: A noiseless patient Spider
Date: Mon, 17 Jun 2024 11:29 UTC
Path: eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: No_spamming@noWhere_7073.org (B. Pym)
Newsgroups: comp.lang.lisp
Subject: Re: summing in a loop and iterate
Date: Mon, 17 Jun 2024 11:29:32 -0000 (UTC)
Organization: A noiseless patient Spider
Lines: 79
Message-ID: <v4p6mn$kpj6$1@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Injection-Date: Mon, 17 Jun 2024 13:29:32 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="3b914719c2918a320d1551e092bd8373";
logging-data="681574"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18UM1eOAorLHFncGCsKIVcK"
User-Agent: XanaNews/1.18.1.6
Cancel-Lock: sha1:4P4J34FkAkhnG696vCD18PB6EyI=
View all headers

> > Lieven Marchand wrote:
> >
> > > Zach KS <elzacho@gmail.com> writes:
> > >
> > > >> On 2012-06-14 13:38:46 EDT, Francogrex wrote:
> > > >> > ;;Use the iterate package
> > > >> >
> > > >> > (let ((data '(("AB" A 12 6) ("AB" G 13 4) ("AB" A 56 9)
> > > >> > ("AB" A 450 10) ("AB" G 380 5))))
> > > >> >
> > > >> > (iterate (for i in data)
> > > >> > (cond ((eql (cadr i) 'A)
> > > >> > (sum (caddr i) into V1)
> > > >> > (sum (cadddr i) into V2))
> > > >> > ((eql (cadr i) 'G)
> > > >> > (sum (caddr i) into V3)
> > > >> > (sum (cadddr i) into V4)))
> > > >> > finally (return (list V2 V1 V4 V3))))
> > > >> >
> > > >> > * (6 12 0 0)
> > > >> > Why is it not summing all 'as expected'?
> > > >> > Also the same issue with loop. (code not provided). Am I missing
> > > >> > something trivial here? I would appreciate some help (preferably with
> > > >> > the loop facility instead of iterate.
> > > >>
> > > >
> > > > There is an error in your code. You forgot to wrap
> > > > your finally clause in a set of parentheses. This should
> > > > give you an error, unless you had previously defined
> > > > "finally", if which case you would return on the first pass
> > > > through the loop, giving you (6 12 0 0).
> > > >
> > > > Should look like:
> > > >
> > > > (let ((data '(("AB" A 12 6) ("AB" G 13 4) ("AB" A 56 9)
> > > > ("AB" A 450 10) ("AB" G 380 5))))
> > > > (iterate (for i in data)
> > > > (cond ((eql (cadr i) 'A)
> > > > (sum (caddr i) into V1)
> > > > (sum (cadddr i) into V2))
> > > > ((eql (cadr i) 'G)
> > > > (sum (caddr i) into V3)
> > > > (sum (cadddr i) into V4)))
> > > > (finally (return (list V2 V1 V4 V3)))))
> > > >
> > > > ...but you should also be using first, second, third, fourth like
> > > > Barry implicitly suggests as well.
> > >
> > > Or use destructuring.
> > >
> > > (let ((data '(("AB" A 12 6) ("AB" G 13 4) ("AB" A 56 9)
> > > ("AB" A 450 10) ("AB" G 380 5))))
> > > (loop for (s label i j) in data
> > > when (eq label 'A)
> > > sum i into v1
> > > and
> > > sum j into v2
> > > when (eq label 'G)
> > > sum i into v3
> > > and
> > > sum j into v4
> > > finally (return (list v1 v2 v3 v4))))

Gauche Scheme

(use util.match) ;; match-lambda

(define data '(("AB" A 12 6) ("AB" G 13 4) ("AB" A 56 9)
("AB" A 450 10) ("AB" G 380 5)))

;; We don't need no stinkin' loops!
(receive (a-nums g-nums)
(partition (lambda(x) (eqv? 'A (cadr x))) data)
(append-map
(match-lambda [((_ _ m n) ...) `(,(apply + m) ,(apply + n))])
(list a-nums g-nums)))

===>
(518 25 393 9)

1

rocksolid light 0.9.8
clearnet tor