Вы можете использовать loop
для этого:
(loop :for (a b) :on list :by #'cddr
:sum (- a b))
Конструкция for
- on
выходит за рамки списка, for
может разрушить это, by
даетпошаговая функция (по умолчанию #'cdr
).
Если вы абсолютно хотите использовать функции более высокого порядка, вам нужно сначала разбить раздел (как вы уже догадались) или найти механизм пошагового выполнения.
Разбиениеснова можно сделать через loop
или через мошенничество.После этого вы можете уменьшить:
(reduce (lambda (sum pair)
(+ sum (apply #'- pair)))
(partition 2 list)
:initial-value 0)
В качестве альтернативы вы можете думать об этом как о чередующемся сложении и вычитании числа:
(reduce #'+
(mapcar #'funcall
(circular-list #'+ #'-)
list))
(Circular-list
от alexandria
.)