순회 프로시저가 전달받은 프로시저를 어떻게 호출하고 값을 몇 개 요구하는지 확인하세요. apply가 리스트의 요소를 인자로 전달하는 방법도 찾아볼 수 있습니다.
오른쪽부터 리스트 만들기
완전한 예제를 플레이그라운드에 붙여 넣고 실행하세요.
(fold-right cons (list) (list 1 2 3))결과
(1 2 3)fold-right는 빈 리스트에서 시작해 3, 2, 1 순서로 방문합니다. 현재 요소를 첫 인자로, 지금까지 만든 리스트를 둘째 인자로 전달해 cons를 호출합니다. 호출할 때마다 요소가 맨 앞에 붙으므로 최종 리스트는 (1 2 3)입니다.
순회 중에 호출하도록 전달한 프로시저를 콜백이라고 합니다. 한 단계의 결과를 다음 단계로 넘기는 값은 누적값이라고 합니다.
호출과 반환 값 확인하기
각 순회 프로시저는 컬렉션을 하나만 받습니다. 리스트 인자는 마지막 꼬리가 빈 리스트인 올바른 리스트여야 합니다.
표의 proc과 predicate는 전달할 프로시저를 뜻합니다. 술어인 predicate는 요소가 조건에 맞는지 검사합니다. fold-right를 제외하면 왼쪽부터 순회합니다.
| 호출 | 콜백 호출 | 콜백의 반환 조건과 전체 결과 |
|---|---|---|
(map proc list) | (proc element) | 호출마다 값 하나를 받아 새 리스트에 모음 |
(filter predicate list) | (predicate element) | 호출마다 값 하나를 받음. 그 값이 #f인 요소만 제외 |
(all? predicate list), (any? predicate list) | (predicate element) | 호출마다 #t나 #f 하나를 받음. 답이 정해지면 불리언을 반환 |
(reduce proc init list), (fold-left proc init list) | (proc accumulator element) | 호출마다 값 하나를 받아 다음 누적값으로 사용. 최종 누적값을 반환 |
(fold-right proc init list) | (proc element accumulator) | 오른쪽부터 방문. 호출마다 값 하나를 받아 다음 누적값으로 사용. 최종 누적값을 반환 |
(string-map proc string) | (proc character) | 호출마다 문자 하나를 받아 새 문자열을 반환 |
(vector-map proc vector) | (proc element) | 호출마다 값 하나를 받아 새 벡터를 반환 |
(for-each proc list), (string-for-each proc string), (vector-for-each proc vector) | (proc element) | 콜백이 반환한 값은 개수와 관계없이 버림. 전체 호출은 값 0개를 반환 |
reduce와 fold-left는 같은 프로시저입니다. fold는 init을 첫 누적값으로 사용합니다. 리스트가 비어 있으면 init을 그대로 반환합니다.
문자열과 벡터는 첫 콜백 호출 전에 요소들을 복사해 둡니다. 따라서 순회 도중 원본 벡터를 바꿔도 방문할 요소는 달라지지 않습니다.
인터프리터는 전달받은 프로시저를 직접 호출합니다. 오류와 경고, 일회용 연속체를 통한 탈출에는 일반 리스펙스 호출 규칙이 적용됩니다. 탈출 방법은 연속체에서 설명합니다.
apply로 한 번 호출하기
(apply proc arg ... final-list)는 proc를 한 번 호출합니다. 직접 적은 arg 값 뒤에 final-list의 요소들을 붙여 인자로 전달합니다. 마지막 리스트는 올바른 리스트여야 합니다.
apply는 proc가 반환한 값을 모두 보존합니다. 꼬리 위치에서는 돌아올 호출 단계를 추가로 남기지 않고 proc를 호출합니다. 자세한 설명은 꼬리 호출을 보세요.
오류가 난 곳 찾기
| 오류 | 확인할 곳 |
|---|---|
E302 | 바깥 프로시저와 콜백의 인자 수를 표의 두 호출과 대조하세요. apply에서는 직접 적은 인자와 마지막 리스트의 요소를 합쳐 세세요. |
E320 | 표에서 값 하나를 요구하는데 콜백이 값을 0개 또는 여러 개 반환했습니다. 값 하나를 반환하도록 고치세요. 출력 같은 동작만 필요하면 for-each 계열을 쓰세요. |
E312 | 컬렉션 타입과 올바른 리스트 조건을 확인하세요. all?와 any?에서는 불리언을, string-map에서는 문자를 반환하세요. |