언제 필요한가요?
변환 하나에 이름을 붙여야 하거나 다른 프로시저에 동작을 넘겨야 할 때 프로시저를 만드세요. 이름 있는 축약형이 가장 읽기 쉽습니다. 동작이 작고 그 자리에서만 쓰인다면 lambda가 편합니다.
실행으로 확인하기
LISPEX
(define (sum first . rest) (apply + first rest))
(sum 1 2 3 4)관측 결과
OUTPUT
10예제 읽기
sum은 인자를 적어도 하나 받아야 합니다. first에는 1이 들어가고 rest에는 새 리스트 (2 3 4)가 들어갑니다. apply는 따로 적은 first와 이 리스트를 하나로 합친 뒤 +를 한 번만 호출합니다.
이 순서로 생각하세요
- 인자 수가 맞지 않으면 프로시저 본문이 시작되기 전에 E302가 납니다.
- 점 나머지 매개변수는 남은 인자를 모아 만든 새 올바른 리스트를 받습니다.
apply는 앞쪽에 적은 인자들과 마지막 올바른 리스트 하나를 받습니다. 그리고 꼬리 위치를 보존합니다.
빠르게 고르기
| 형태 | 잘 맞는 용도 | 인자 수 |
|---|---|---|
(define (f x) body) | 이름 있는 재사용 프로시저 | 고정 |
(lambda (x y) body) | 익명 프로시저 값 | 고정 |
(lambda args body) | 모든 인자를 리스트 하나로 받기 | 0개 이상 |
(lambda (x . rest) body) | 필수 인자와 나머지 | 고정 부분 이상 |
(apply f a final-list) | 데이터로 모은 인자 적용 | f가 검사 |
흔한 오해
프로시저가 아닌 값을 적용하면 E301입니다. apply의 마지막 리스트가 부적절한 리스트이면 리스트 도메인 오류가 납니다.
현재 경계
- 게스트 클로저를 실행할 때 호스트
apply를 쓰지 않습니다.
다음으로
map과 filter, fold에 동작을 넘기는 법은 고차 프로시저에서 이어집니다. 클로저가 캡처하는 셀은 바인딩에서 확인하세요.