언제 필요한가요?
하나의 변환에 이름이 필요하거나 다른 프로시저에 동작을 넘겨야 할 때 프로시저를 만드세요. 이름 있는 축약형이 가장 읽기 쉽고, 작고 로컬한 동작은 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에 동작을 넘기는 법을 보고, 바인딩에서 클로저가 캡처하는 셀을 확인하세요.