• .Re: summing in a loop and iterate

    From Robert L.@21:1/5 to All on Sun Feb 20 02:28:45 2022
    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 or Racket:

    (require srfi/1) ;; fold for Racket

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

    (fold
    (lambda (xs accum)
    (let ((nums (drop xs 2)))
    (map +
    (if (eqv? 'A (second xs))
    `(,@nums 0 0)
    `(0 0 ,@nums))
    accum)))
    '(0 0 0 0)
    data)


    '(518 25 393 9)

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)