En Common Lisp, una función no solo puede devolver un valor, sino que puede devolver múltiples valores.
Por ejemplo, floor, que redondea hacia abajo en dirección al cero, devuelve dos valores: el primero es el valor redondeado y el segundo es el residuo.
(floor 3.5) ; => 3
; 0.5
(Mostraremos los múltiples valores devueltos en líneas separadas de la salida.)
Si quieres que una función devuelva múltiples valores, usas el accesor values:
(defun three-numbers () (values 1 2 3))
(three-numbers) ; => 1
; 2
; 3
Si tienes una lista de valores que quieres devolver, puedes usar value-list:
(values-list '(a b c)) ; => a
; b
; c
Si solo te interesa el primer valor, no necesitas hacer nada especial: el lenguaje se encarga.
(+ (values 1 2 3) (values 10 20 30)) ; => 11
Sin embargo, si quieres acceder a esos otros valores, hay varias funciones que necesitarás usar.
Las dos macros principales son multiple-value-list y multiple-value-bind.
Se usan para envolver algo que devuelva múltiples valores y capturar todos esos valores.
La primera crea una lista con todos los valores.
La segunda te permite vincular variables a cada uno de los valores.
(multiple-value-list (values 1 2 3)) ; => (1 2 3)
(multiple-value-bind (a b c) (values 1 2 3)
(+ a b c)) ; => 6
Ten en cuenta que las variables a, b y c solo existen dentro del ámbito de multiple-values-bind.
Otra macro útil es nth-value. Es como nth para las listas: devuelve el elemento «n-ésimo» de un conjunto de valores múltiples:
(nth-value 0 (values 1 2 3 )) ; => 1
(nth-value 1 (values 1 2 3 )) ; => 2
(nth-value 2 (values 1 2 3 )) ; => 3