다중 값 만들고 소비하기

`values`로 값 패킷을 반환하고 `call-with-values`로 인자 수가 맞는 소비자에 연결합니다.

실행으로 확인하기

LISPEX
(call-with-values (lambda () (values 3 4)) (lambda (a b) (+ (* a a) (* b b))))

관측 결과

OUTPUT
25

패턴 따라가기

  1. 값 묶음을 만듭니다. 첫 람다는 리스트가 아니라 3, 4라는 두 값을 반환합니다.
  2. 소비자를 맞춥니다. 둘째 람다는 매개변수가 두 개라 값 묶음의 개수와 정확히 맞습니다.
  3. 평범하게 계산합니다. 소비자 안의 a, b는 각각 단일 값이며 마지막 산술이 25를 반환합니다.

이 순서로 생각하세요

  • 생산자는 호출 피연산자, 테스트, 바인딩 초기식, 대입 RHS가 아니라 전용 생산자 컨텍스트에 둡니다.
  • 소비자는 생성된 각 값을 인자 하나씩 받고 일반 인자 수 검사를 거칩니다.
  • 폐기 가능한 제어 경로에서 0개 값은 (values)로 의도적으로 표현합니다.

직접 확인하기

소비자를 list로 바꾸면 무엇이 저장되며, 생산자 값 묶음과 무엇이 다를까요?

평범한 리스트 (3 4)가 결과입니다. call-with-values가 인자 두 개를 넘겼고 list가 저장 가능한 값 하나를 의도적으로 만들었습니다.

흔한 오해

호출자가 값 개수를 기대한다면 의미적 다중 값을 일반 리스트로 인코딩하지 마세요.

다음으로

모든 값 문맥은 매뉴얼에서, 소비자가 잘못된 개수를 기대할 때의 동작은 프로시저 인자 수에서 확인하세요.

다중 값 문맥 · 프로시저와 인자 수