Песочница

Множественные значения и контексты

Множественные значения — результат вычисления, а не сохраняемое гостевое значение. Каждая позиция продолжения объявляет допустимое число значений.

Когда это нужно

Используйте несколько значений, когда вычисление естественно получает несколько связанных результатов и сразу передаёт их известному потребителю. Для хранения группы как данных выберите список или вектор.

Проверьте запуском

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) там, где нужно одно значение, — ошибка, а не неопределённый маркер.

Куда дальше

Практическое руководство строит производителя и потребителя, а арность процедур объясняет ошибку на стороне потребителя.

Руководство по нескольким значениям · Процедуры и арность