call-with-values로 함수가 반환한 두 값을 다른 함수에 바로 전달할 수 있습니다. 두 값을 함께 저장하려면 list로 리스트 하나에 모읍니다.
두 값을 두 인자로 받기
아래 예제 전체를 플레이그라운드에서 실행하세요.
(call-with-values
(lambda () (values 3 4))
(lambda (a b) (+ (* a a) (* b b))))결과
25call-with-values는 먼저 (lambda () (values 3 4))를 인자 없이 호출합니다. 이 프로시저는 3과 4를 두 값으로 반환합니다.
그런 다음 둘째 프로시저에 각 값을 별도 인자로 전달합니다. 매개변수 a와 b는 각각 3과 4를 받으므로 제곱의 합은 25입니다.
첫째 프로시저를 생산자, 둘째 프로시저를 소비자라고 부릅니다. 한 번의 호출이 반환한 값들을 통틀어 값 묶음이라고 합니다. 이 예제에서는 소비자가 묶음에 든 수 두 개를 각각 받습니다.
결과를 리스트로 저장하기
두 수를 한 이름에 저장하려면 아래 예제 전체를 실행하세요.
(define saved
(call-with-values (lambda () (values 3 4)) list))
saved결과
(3 4)여기서는 list가 소비자입니다. 인자 두 개를 받아 리스트 하나를 만듭니다. define은 그 리스트 하나를 saved에 저장합니다.
values는 호출한 쪽에 값들을 반환합니다. 데이터로 보관하려면 리스트나 벡터에 모으세요. 원소가 두 개인 리스트도 수 두 개를 담은 값 하나입니다.
다음 호출에 필요한 값 개수 확인하기
소비자는 생산자가 반환한 개수만큼 인자를 받을 수 있어야 합니다. 첫 예제는 매개변수 두 개를 사용합니다. list는 개수에 관계없이 인자를 받습니다.
일반 호출의 각 인자식과 조건식, 변수의 초기식과 대입할 값을 계산하는 식에는 값 하나가 필요합니다. 여러 결과를 이 자리에 쓰려면 먼저 call-with-values로 받으세요. 생산자 프로시저 자체는 변수에 저장해 call-with-values에 전달할 수 있습니다.
(values)는 값 0개를 반환합니다. 인자 없이 호출할 수 있는 소비자가 이를 받을 수 있습니다. begin의 마지막 식 앞처럼 결과를 버리는 자리에서도 쓸 수 있습니다.
직접 바꿔 보기
첫 예제에서 (values 3 4)를 (list 3 4)로 바꾸세요. 매개변수가 두 개인 소비자가 그대로 동작할까요?
답
인자 수 오류인 E302가 납니다. 생산자가 리스트 하나를 반환하므로 소비자도 인자 하나를 받습니다. 매개변수가 두 개라 인자도 두 개가 필요합니다. 수 두 개를 따로 반환하려면 values를 쓰세요.
다중 값 매뉴얼에서 자리마다 받을 수 있는 값 개수를 확인하세요. 고정 인자 수와 가변 인자 수는 프로시저에서 설명합니다.