In Common Lisp kann eine Funktion nicht nur einen Wert zurückgeben, sondern mehrere Werte.
Zum Beispiel gibt floor, das in Richtung Null abrundet, zwei Werte zurück: Der erste ist der gerundete Wert und der zweite der Rest.
(floor 3.5) ; => 3
; 0.5
(Wir zeigen mehrere Rückgabewerte auf getrennten Zeilen der Ausgabe.)
Wenn eine Funktion mehrere Werte zurückgeben soll, verwendest du den values-Accessor:
(defun three-numbers () (values 1 2 3))
(three-numbers) ; => 1
; 2
; 3
Wenn du eine Liste von Werten zurückgeben möchtest, kannst du value-list verwenden:
(values-list '(a b c)) ; => a
; b
; c
Wenn dich nur der erste Wert interessiert, musst du nichts Besonderes tun, die Sprache kümmert sich darum:
(+ (values 1 2 3) (values 10 20 30)) ; => 11
Wenn du aber auf die anderen Werte zugreifen möchtest, brauchst du dafür mehrere Funktionen.
Zwei wichtige Makros sind multiple-value-list und multiple-value-bind.
Damit umschließt du etwas, das mehrere Werte zurückgibt, und fängst dabei alle Werte ein.
Das erste erzeugt eine Liste aller Werte.
Das zweite lässt dich Variablen an die einzelnen Werte binden.
(multiple-value-list (values 1 2 3)) ; => (1 2 3)
(multiple-value-bind (a b c) (values 1 2 3)
(+ a b c)) ; => 6
Beachte, dass die Variablen a, b und c nur innerhalb von multiple-values-bind im Gültigkeitsbereich liegen.
Ein weiteres nützliches Makro ist nth-value. Es funktioniert wie nth für Listen: Es gibt das „n-te“ Element aus einer Menge mehrerer Werte zurück:
(nth-value 0 (values 1 2 3 )) ; => 1
(nth-value 1 (values 1 2 3 )) ; => 2
(nth-value 2 (values 1 2 3 )) ; => 3