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))))
Sysop: | Keyop |
---|---|
Location: | Huddersfield, West Yorkshire, UK |
Users: | 326 |
Nodes: | 16 (2 / 14) |
Uptime: | 64:33:41 |
Calls: | 7,205 |
Files: | 12,567 |
Messages: | 5,546,911 |