언제 필요한가요?
한 계산이 서로 맞물린 결과 여러 개를 만들어 곧바로 정해진 소비자에게 넘긴다면 다중 값을 쓰세요. 그 묶음을 데이터로 저장해야 한다면 리스트나 벡터가 맞습니다.
실행으로 확인하기
LISPEX
(call-with-values (lambda () (floor/ 17 5)) list)관측 결과
OUTPUT
(3 2)예제 읽기
floor/는 몫 3과 나머지 2를 두 개의 값으로 냅니다. call-with-values가 이 둘을 list의 두 인자로 넘깁니다. list는 잠깐 스쳐 가는 값 묶음을 저장할 수 있는 (3 2)로 바꿉니다.
이 순서로 생각하세요
- 단일 값 컨텍스트는 값을 정확히 하나만 받습니다. 0개이거나 2개 이상이면 E320이 납니다.
- 폐기 컨텍스트는 개수를 가리지 않고 받습니다.
call-with-values는 생산자가 낸 패킷을 소비자의 인자로 넘깁니다. values의 피연산자들도 그 자체가 단일 값 컨텍스트이며, 왼쪽부터 평가됩니다.
빠르게 고르기
| 문맥 | 받는 값 개수 | 예 |
|---|---|---|
| 일반 피연산자나 바인딩 초기식 | 정확히 하나 | (+ (values 1) 2) |
begin의 마지막 전 폼 | 개수 무관, 버림 | (begin (values 1 2) 3) |
call-with-values 생산자 | 개수 무관 | (lambda () (values 1 2)) |
call-with-values 소비자 | 생산 개수를 받을 수 있어야 함 | (lambda (a b) ...) |
| 저장할 집합 | 리스트/벡터 값 하나 | (list 1 2) |
흔한 오해
다중 값은 리스트나 벡터로 박싱되지 않습니다.
현재 경계
- 값 하나가 필요한 자리에
(values)를 쓰면 오류입니다. 미지정 센티널이 아닙니다.
다음으로
생산자와 소비자를 직접 만들어 보려면 실용 가이드를 여세요. 소비자 쪽에서 나는 실패는 프로시저 인자 수에서 설명합니다.