요소를 고르려면 filter, 각 요소를 바꾸려면 map, 하나의 결과로 합치려면 fold를 사용하세요. 이 예제는 리스트에서 홀수만 골라 제곱한 뒤 모두 더합니다.
고르고 바꾸고 더하기
완전한 예제를 플레이그라운드에 붙여 넣고 실행하세요.
(reduce + 0 (map (lambda (x) (* x x)) (filter odd? (list 1 2 3 4))))결과
10중첩된 호출을 안쪽부터 읽어 보세요.
filter는odd?가#t를 반환하는 요소인1과3을 남깁니다.map은 두 요소를 제곱해(1 9)를 만듭니다.reduce는0에서 시작해 제곱한 값을 더하여10을 만듭니다.
이 프로시저들은 다른 프로시저를 인자로 받습니다. 이런 프로시저를 고차 프로시저라고 합니다. 각 요소를 처리하도록 전달한 프로시저는 흔히 콜백이라고 부릅니다.
필요한 결과로 선택하기
| 할 일 | 프로시저 |
|---|---|
| 입력 요소마다 변환한 요소 하나씩 만들기 | map. 문자열에는 string-map, 벡터에는 vector-map |
| 조건에 맞는 요소만 남기기 | filter |
| 요소를 하나의 결과로 누적하기 | reduce 또는 같은 기능의 fold-left. 오른쪽부터 시작하려면 fold-right |
| 모든 요소나 하나 이상의 요소가 조건에 맞는지 확인하기 | all? 또는 any?. 답이 정해지면 즉시 멈춤 |
| 각 요소를 출력하는 등의 동작 수행하기 | for-each, string-for-each, vector-for-each |
순회 프로시저는 리스트나 문자열이나 벡터를 하나만 받습니다. 호출별 인자와 반환 값은 참조 문서에서 확인하세요.
apply로 리스트의 요소를 인자로 전달하기
인자를 리스트에 담아 두었다면 apply로 프로시저를 한 번 호출하세요.
(apply + 1 (list 2 3))결과
6이 코드는 1, 2, 3을 인자로 전달해 +를 호출합니다. 마지막 리스트의 요소들이 그 앞에 적은 인자 뒤에 붙습니다.
고칠 곳 찾기
E302는 인자 수가 맞지 않을 때 발생합니다. 바깥 호출과 그 호출에 전달한 프로시저의 인자 수를 모두 확인하세요. 예를 들어 map은 요소 하나를 전달하고, reduce는 누적값과 요소를 전달합니다.
E320은 값 하나가 필요한 곳에서 호출이 값을 0개 또는 여러 개 반환했을 때 발생합니다. map에 display를 전달했다면 출력용으로 for-each를 쓰세요. 새 리스트가 필요하다면 map에 전달한 프로시저가 요소마다 값 하나를 반환하도록 고치세요.
고차 프로시저 참조에 이 조건들을 모아 두었습니다. 오류가 난 호출과 대조해 보세요.
직접 바꿔 보기
첫 예제의 odd?를 even?으로 바꾸면 무엇을 반환할까요?
답
2와 4를 남겨 (4 16)으로 제곱하고 20을 반환합니다.
순회 과정을 직접 제어하려면 재귀를 사용하세요.