프로시저, 인자 수, 적용, apply

고정 인자 클로저와 점 인자 클로저는 어휘 스코프와 결정적 인자 평가를 씁니다. 직접 호출과 `apply`는 적용 디스패처 하나를 함께 씁니다.

언제 필요한가요?

변환 하나에 이름을 붙여야 하거나 다른 프로시저에 동작을 넘겨야 할 때 프로시저를 만드세요. 이름 있는 축약형이 가장 읽기 쉽습니다. 동작이 작고 그 자리에서만 쓰인다면 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를 쓰지 않습니다.

다음으로

mapfilter, fold에 동작을 넘기는 법은 고차 프로시저에서 이어집니다. 클로저가 캡처하는 셀은 바인딩에서 확인하세요.

고차 프로시저 · 바인딩과 스코프