Search code examples
lispcommon-lispsbcl

Common lisp: loop through pairs of a list


I have a list who's length is divisible by two, and I'm looking for something similar to the answer to this question:

(loop for (a b) on lst while b
      collect (+ a b))

However there is overlap between elements:

(1 2 3 4 5) -> (3 5 7 9)

adding 1 and 2 and then 2 and 3 etc.

Where as I have a list like (1 2 3 4) and am looking for something like

((1 2) (3 4))

as output. Is there a way to make loop step correctly over the list? Another solution.


Solution

  • Something like this should work:

    (let ((list '(1 2 3 4)))
      (loop :for (a b) :on list :by #'cddr :while b 
            :collect (cons a b)))
    

    Also a more verbose variant:

    (let ((list '(1 2 3 4)))
      (loop :for a :in list :by #'cddr
            :for b :in (cdr list) :by #'cddr
            :collect (cons a b)))