이전 문서입니다. 현재 인자와 결과, 순회 순서는 고차 프로시저에서 확인하세요.
이 페이지는 리스펙스의 핵심 고차 함수에 대한 참조를 제공합니다. 이 함수들은 다른 함수를 인자로 받아 리스트를 처리하며, 강력하고 선언적인 프로그래밍 스타일을 가능하게 합니다.
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
함수를 반복적으로 적용하여 리스트를 단일 값으로 축약합니다. 리스트를 순회하며 각 단계에서 업데이트되는 누산기를 유지합니다.
- 구문:
(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"fold-left
리스트를 왼쪽부터(첫 요소에서 마지막 요소로) 접어 하나의 값으로 줄입니다. fold-left는 reduce와 같은 연산의 R6RS 이름입니다. 함수는 누산기를 먼저, 현재 요소를 나중에 받습니다.
- 구문:
(fold-left FUNCTION INITIAL_VALUE LIST) - 인자:
FUNCTION:(누산기 현재요소)를 받아 다음 누산기를 반환하는 함수.INITIAL_VALUE: 누산기의 시작값.LIST: 접을 리스트.
- 반환: 최종 누산기 (리스트가 비어 있으면
INITIAL_VALUE). - 오류: 인자가 함수, 값, 리스트가 아니면
RuntimeError를 발생시킵니다.
예시:
(fold-left - 0 (list 1 2 3))
;; 결과: -6fold-right
리스트를 오른쪽부터(마지막 요소에서 첫 요소로) 접습니다. fold-left와 달리 함수는 현재 요소를 먼저, 누산기를 나중에 받으므로 (fold-right cons (list) …)는 리스트를 그대로 다시 만듭니다.
- 구문:
(fold-right FUNCTION INITIAL_VALUE LIST) - 인자:
FUNCTION:(현재요소 누산기)를 받아 다음 누산기를 반환하는 함수.INITIAL_VALUE: 리스트 오른쪽 끝에서 쓰는 누산기.LIST: 접을 리스트.
- 반환: 최종 누산기 (리스트가 비어 있으면
INITIAL_VALUE). - 오류: 인자가 함수, 값, 리스트가 아니면
RuntimeError를 발생시킵니다.
예시:
(fold-right cons (list) (list 1 2 3))
;; 결과: (list 1 2 3)
(fold-right - 0 (list 1 2 3))
;; 결과: 2apply
함수를 인자 리스트로 호출합니다. 마지막 인자 앞의 인자들이 먼저 전달되고, 마지막 리스트의 요소들이 나머지 인자로 펼쳐집니다. 마지막 인자는 리스트여야 합니다. apply는 꼬리 호출입니다.
(apply + (list 1 2 3 4)) ;; 결과: 10values와 call-with-values
values는 하나의 표현식에서 0개 이상의 값을 만듭니다.
call-with-values는 값을 만드는 producer thunk와 그 값을 받을 consumer
프로시저를 연결합니다. producer가 만든 값들이 그대로 consumer의 인자가
됩니다. 최상위에서는 여러 값이 한 줄에 하나씩 출력됩니다. 단일 값이 필요한
자리에서 값이 0개이거나 2개 이상이면 런타임 오류입니다.
v1.4 런타임 갱신에서는 이 다중 값 경로가 네이티브 인터프리터, 브라우저/Node WASM 빌드, Meaning Environment, same-origin 백엔드 agreement 체크까지 함께 지나가도록 확장되었습니다.
for-each
리스트의 각 요소에 함수를 왼쪽에서 오른쪽으로 적용해 부수 효과를 내고, 결과는 버리며, 미지정 값을 반환합니다. 모은 결과가 필요하면 map을 쓰세요.
(for-each display (list 1 2 3))
;; 출력: 123