다중 값 반환하고 받기

두 반환 값을 함수에 전달하거나 리스트 하나로 모아 저장합니다.

call-with-values로 함수가 반환한 두 값을 다른 함수에 바로 전달할 수 있습니다. 두 값을 함께 저장하려면 list로 리스트 하나에 모읍니다.

두 값을 두 인자로 받기

아래 예제 전체를 플레이그라운드에서 실행하세요.

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

결과

출력
25

call-with-values는 먼저 (lambda () (values 3 4))를 인자 없이 호출합니다. 이 프로시저는 3과 4를 두 값으로 반환합니다.

그런 다음 둘째 프로시저에 각 값을 별도 인자로 전달합니다. 매개변수 a와 b는 각각 3과 4를 받으므로 제곱의 합은 25입니다.

첫째 프로시저를 생산자, 둘째 프로시저를 소비자라고 부릅니다. 한 번의 호출이 반환한 값들을 통틀어 값 묶음이라고 합니다. 이 예제에서는 소비자가 묶음에 든 수 두 개를 각각 받습니다.

결과를 리스트로 저장하기

두 수를 한 이름에 저장하려면 아래 예제 전체를 실행하세요.

LISPEX
(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를 쓰세요.

다중 값 매뉴얼에서 자리마다 받을 수 있는 값 개수를 확인하세요. 고정 인자 수와 가변 인자 수는 프로시저에서 설명합니다.