리듀싱은 시퀀스의 각 원소에 함수를 반복해서 적용하고, 그 결과를 어떤 방식으로든 누적하는 거예요. 적용되는 함수는 두 개의 매개변수를 받아요. 현재 누적된 값과 처리할 항목이에요. 이 함수는 새로운 누적 값으로 평가되어야 해요.
Common Lisp에서는 이 과정을 reduce 함수로 처리해요.
가장 단순한 형태는 다음과 같아요.
(reduce #'function-to-apply sequence :initial-value value)
초깃값이 제공된다는 점에 주목해요. 이 값은 첫 번째 원소가 처리될 때 함수에 전달되는 '현재 누적된 값'이 돼요.
다음은 초깃값 10으로 시작해서 리스트의 숫자들을 모두 더하는 예제예요.
(reduce #'+ '(1 2 3 4) :initial-value 10) ; => 20
시퀀스가 비어 있으면 함수는 호출되지 않고, 폼은 초깃값으로 평가돼요.
Lisp 외계인 Logan은 숫자를 좋아하고, 정리하는 것도 좋아해요.
Logan은 숫자 배열을 받아서 두 개의 배열로 이루어진 쌍을 만들어 주는 함수 작성을 도와달라고 해요. 첫 번째 배열에는 홀수가, 두 번째 배열에는 짝수가 들어가요.
먼저 두 개의 배열로 이루어진 쌍과 숫자 하나를 받아서, 그 숫자가 홀수인지 짝수인지에 따라 알맞은 배열에 넣는 함수를 만들어야 해요:
(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개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.