다중 값과 값 컨텍스트

다중 값은 평가의 결과일 뿐, 저장할 수 있는 게스트 값이 아닙니다. 연속 위치는 저마다 몇 개의 값을 받을지 선언합니다.

언제 필요한가요?

한 계산이 서로 맞물린 결과 여러 개를 만들어 곧바로 정해진 소비자에게 넘긴다면 다중 값을 쓰세요. 그 묶음을 데이터로 저장해야 한다면 리스트나 벡터가 맞습니다.

실행으로 확인하기

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)를 쓰면 오류입니다. 미지정 센티널이 아닙니다.

다음으로

생산자와 소비자를 직접 만들어 보려면 실용 가이드를 여세요. 소비자 쪽에서 나는 실패는 프로시저 인자 수에서 설명합니다.

다중 값 가이드 · 프로시저와 인자 수