call-with-values로 한 번의 호출에서 나온 여러 결과를 받을 수 있습니다. 각 결과를 다른 프로시저에 별도 인자로 전달하거나 리스트 하나로 모아 저장합니다.
몫과 나머지 받기
이 페이지의 예제는 플레이그라운드에서 하나씩 따로 실행하세요.
(call-with-values (lambda () (floor/ 17 5)) list)결과
(3 2)floor/는 몫 3과 나머지 2를 두 값으로 반환합니다. call-with-values는 이 둘을 list에 두 인자로 전달합니다. list는 변수에 저장할 수 있는 리스트 하나인 (3 2)를 반환합니다.
두 결과로 바로 계산하려면 매개변수 두 개로 받으세요.
(call-with-values
(lambda () (floor/ 17 5))
(lambda (q r) (+ (* q 5) r)))결과
17call-with-values는 생산자인 첫째 프로시저를 인자 없이 호출합니다. 반환된 값들은 소비자인 둘째 프로시저에 모두 인자로 전달합니다. 소비자는 그 개수를 받을 수 있어야 합니다. 나머지 인자를 받는 매개변수도 여기에 포함하며, 개수가 맞지 않으면 E302가 납니다.
값 하나가 필요한 자리
값 문맥은 식 안에서 받을 수 있는 값 개수가 정해진 자리를 뜻합니다. 일반 호출의 각 인자식에는 값이 정확히 하나 필요합니다. if 조건식과 변수의 초기식, set!과 define의 오른쪽 식도 같습니다.
(+ (values 1 2) 3)진단
E320+의 첫 인자식이 값 하나가 필요한 자리에 값 두 개를 반환했습니다. 같은 자리에서 (values)로 값 0개를 반환해도 E320이 납니다. (values)는 빈자리를 채울 값을 제공하지 않습니다.
values의 각 인자식도 값 하나를 반환해야 합니다. 인자식은 왼쪽부터 평가합니다. 따라서 (values (values 1 2) 3)도 E320을 냅니다.
다른 개수도 받는 자리
본문이나 begin의 마지막 식 앞에서는 결과를 버립니다. 이 자리에서는 값 개수에 제한이 없습니다. call-with-values의 생산자도 소비자가 받을 수 있는 개수라면 몇 개든 반환할 수 있습니다.
| 식 | 결과 | 이유 |
|---|---|---|
(+ (values 1) 2) | 3 | values가 값 하나를 반환함 |
(begin (values 1 2) 3) | 3 | 첫 식의 값 두 개를 버림 |
(call-with-values (lambda () (values)) list) | () | list가 인자 없이 호출되어 빈 리스트 하나를 반환함 |
(call-with-values (lambda () (values 1 2)) list) | (1 2) | list가 인자 두 개를 받아 리스트 하나를 반환함 |
여러 결과를 값 하나로 저장하기
여러 반환 값을 통틀어 값 묶음이라고 하며, 이 값들을 다음 계산에 전달합니다. 결과를 저장하려면 리스트나 벡터를 만드세요. 예를 들어 (list 1 2)는 원소 두 개를 담은 값 하나입니다. 이 리스트를 매개변수가 두 개인 소비자에 전달하면 인자가 하나뿐이라 E302가 납니다.