Когда это нужно
Используйте несколько значений, когда вычисление естественно получает несколько связанных результатов и сразу передаёт их известному потребителю. Для хранения группы как данных выберите список или вектор.
Проверьте запуском
LISPEX
(call-with-values (lambda () (floor/ 17 5)) list)Наблюдаемый результат
OUTPUT
(3 2)Разбор примера
floor/ выдаёт частное 3 и остаток 2 как два значения. call-with-values передаёт их двумя аргументами в list, который превращает временный пакет в сохраняемый список (3 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)там, где нужно одно значение, — ошибка, а не неопределённый маркер.
Куда дальше
Практическое руководство строит производителя и потребителя, а арность процедур объясняет ошибку на стороне потребителя.