Em Common Lisp, uma função não só pode retornar um valor: ela também pode retornar múltiplos valores.
Por exemplo, floor, que arredonda para baixo em direção ao zero, retorna dois valores: o primeiro é o valor arredondado e o segundo é o resto.
(floor 3.5) ; => 3
; 0.5
(Vamos mostrar os múltiplos valores retornados em linhas separadas na saída.)
Se você quer que uma função retorne múltiplos valores, use o acessor values:
(defun three-numbers () (values 1 2 3))
(three-numbers) ; => 1
; 2
; 3
Se você tem uma lista de valores que quer retornar, pode usar value-list:
(values-list '(a b c)) ; => a
; b
; c
Se você só se importa com o primeiro valor, não precisa fazer nada de especial: a linguagem cuida disso:
(+ (values 1 2 3) (values 10 20 30)) ; => 11
No entanto, se você quiser acessar esses outros valores, há várias funções que você vai precisar usar.
As duas principais macros são multiple-value-list e multiple-value-bind.
Elas servem para envolver algo que retorna múltiplos valores e capturar todos eles.
A primeira cria uma lista com todos os valores.
A segunda permite que você vincule variáveis aos valores individuais.
(multiple-value-list (values 1 2 3)) ; => (1 2 3)
(multiple-value-bind (a b c) (values 1 2 3)
(+ a b c)) ; => 6
Repare que as variáveis a, b e c só existem no escopo dentro de multiple-values-bind.
Outra macro útil é nth-value. Ela é como o nth para listas: retorna o "enésimo" item de um conjunto de múltiplos valores:
(nth-value 0 (values 1 2 3 )) ; => 1
(nth-value 1 (values 1 2 3 )) ; => 2
(nth-value 2 (values 1 2 3 )) ; => 3