함수형 라이브러리: 데이터의 교향곡

데이터의 강물에 생각의 그물을 던져보세요. map, filter, reduce와 같은 고차 함수들은 반복적인 작업을 추상화하고, 데이터의 흐름을 우아하게 조각합니다. 코드는 간결해지고, 생각은 명료해집니다.

이 페이지는 리스펙스의 핵심 고차 함수에 대한 참조를 제공합니다. 이 함수들은 다른 함수를 인자로 받아 리스트를 처리하며, 강력하고 선언적인 프로그래밍 스타일을 가능하게 합니다.


map

주어진 함수를 리스트의 모든 요소에 적용하고, 그 결과를 포함하는 새 리스트를 반환합니다. 새 리스트는 항상 원본 리스트와 동일한 수의 요소를 가집니다.

  • 구문: (map FUNCTION LIST)
  • 인자:
    • FUNCTION: 하나의 인자(리스트 요소)를 받아 변환된 값을 반환하는 함수.
    • LIST: 반복 처리할 리스트.
  • 반환: 변환된 요소들을 포함하는 새 리스트.
  • 오류: 인자가 각각 함수와 리스트가 아니면 RuntimeError를 발생시킵니다.

예시:

;; 각 숫자를 제곱한 새 리스트를 생성합니다.
(map (lambda (n) (* n n)) (list 1 2 3 4))
;; 결과: (list 1 4 9 16)

filter

주어진 조건자(predicate) 함수가 참 같은 값(즉 #f가 아닌 값)을 반환하는 원본 리스트의 요소들만 포함하는 새 리스트를 반환합니다.

  • 구문: (filter PREDICATE_FUNCTION LIST)
  • 인자:
    • PREDICATE_FUNCTION: 하나의 인자를 받아 불리언 값(#t이면 유지, #f이면 폐기)을 반환하는 함수.
    • LIST: 필터링할 리스트.
  • 반환: 원본보다 짧거나 같은 길이일 수 있는 새 리스트.
  • 오류: 인자가 각각 함수와 리스트가 아니면 RuntimeError를 발생시킵니다.

예시:

;; 5보다 큰 숫자만 있는 새 리스트를 생성합니다.
(filter (lambda (n) (> n 5)) (list 2 8 4 10 5 7))
;; 결과: (list 8 10 7)

reduce

함수를 반복적으로 적용하여 리스트를 단일 값으로 축약합니다. 리스트를 순회하며 각 단계에서 업데이트되는 "누산기(accumulator)"를 유지합니다.

  • 구문: (reduce FUNCTION INITIAL_VALUE LIST)
  • 인자:
    • FUNCTION: 두 개의 인자 (누산기, 현재_요소)를 받는 함수. 누산기의 새 값을 반환해야 합니다.
    • INITIAL_VALUE: 누산기의 시작 값.
    • LIST: 축약할 리스트.
  • 반환: 전체 리스트를 순회한 후의 누산기의 최종 값.
  • 오류: 인자가 함수, 값, 리스트가 아니면 RuntimeError를 발생시킵니다.

예시: 리스트의 모든 숫자 합산하기

(reduce (lambda (sum el) (+ sum el))
        0
        (list 10 20 30 40))
;; 결과: 100

예시: 리스트에서 가장 긴 단어 찾기

(reduce (lambda (longest word)
          (if (> (length word) (length longest))
              word
              longest))
        ""  
        (list "Lispex" "is" "a" "delightful" "language"))
;; 결과: "delightful"