Зведення полягає в багаторазовому застосуванні функції до кожного елемента послідовності та в накопиченні результатів певним чином. Застосована функція приймає два параметри: поточне накопичене значення та елемент, який потрібно обробити. Вона повинна давати нове накопичене значення.
У Common Lisp для цього використовують функцію reduce.
У найпростішому випадку це має такий вигляд:
(reduce #'function-to-apply sequence :initial-value value)
Зауважмо, що початкове значення задано: саме воно буде тим «поточним накопиченим значенням», яке передають у функцію, коли обробляють перший елемент.
Ось приклад, який додає числа масиву, починаючи з початкового значення 10:
(reduce #'+ '(1 2 3 4) :initial-value 10) ; => 20
Зазначимо, що якщо послідовність порожня, функція жодного разу не викликається, і форма обчислюється в початкове значення.
Логан, прибулець із Lisp, любить числа, а ще любить наводити лад.
Він просить нас допомогти йому написати функцію, яка приймає масив чисел і повертає пару з двох масивів: перший містить усі непарні числа, а другий - усі парні.
Спочатку нам потрібно створити функцію, яка приймає пару з двох масивів і число та кладе це число до потрібного масиву залежно від того, парне воно чи непарне:
(categorize-number '((1) . (2)) 23) ; => ((23 1) . (2))
(categorize-number '((1) . (2)) 42) ; => ((1) . (42 2))
Тепер, скориставшись функцією, яку ми щойно створили, можемо написати ще одну функцію, яка приймає масив чисел і розподіляє їх так само, як ми робили вище:
(partition-numbers '(1 2 3 4)) ; => ((3 1) . (4 2))
(partition-numbers '(42 31 24 13)) ; => ((13 31) . (24 42))
Зареєструйтеся на Exercism, щоб вивчати й опановувати Common Lisp, а також 27 концепцій92 вправи та справжнє наставництво від людей, і все це безкоштовно.