Обычный способ создания определений для нескольких значений заключается в использовании define-values
, который в значительной степени работает так, как вы ожидали.
(define-values (Q R) ; Q and R are defined
(matrix-qr (matrix [[12 -51 4]
[ 6 167 -68]
[-4 24 -41]])))
Существует также let
эквивалент для нескольких значений, называется let-values
(а также let*-values
и letrec-values
).
Игнорирование значений сложнее. Например, нет такой функции, как (first-value ...)
, поскольку обычное функциональное приложение не создает продолжения, которое может принимать несколько значений. Тем не менее, вы можете использовать что-то вроде match-define-values
вместе с маркером отверстий _
, чтобы игнорировать значения и просто не связывать их.
(match-define-values (Q _) ; only Q is defined
(matrix-qr (matrix [[12 -51 4]
[ 6 167 -68]
[-4 24 -41]])))
Теоретически можно создать макрос, который может либо конвертировать несколько значений в виде списка или просто использовать только конкретное значение, но в целом это избежать. Возвращение нескольких значений не должно выполняться легко, поэтому для почти всех возвращаемых им функций обычно не имеет смысла использовать одно из значений, но игнорировать другое.