Wer Python kennt weiß, dass es dort Funktionen implementiert sind, die mehrere Werte als Ergebnis zurückgeben. Python wählt hier einen pragmatischen, auf existierenden Sprachmitteln basierenden Weg: multiple Rückgabewerte werden in der Regel einfach durch Tupel abgebildet. Python liefert in diesem Fall tatsächlich nur einen Rückgabewert (z.B. ein Tupel, oder ein NamedTupel, oder ein dict(), oder ein …), den der Aufrufer entsprechend verarbeiten muß.
Common Lisp hat dazu einen separaten Weg eingebaut. Natürlich wäre es auch hier möglich, eine Liste als einzigen Rückgabewert zurückzugeben. Es wurde sich aber für ein eigenes Konzept „Multiple Values“ – oder einfach „Values“ – entscheiden.
Returning / Creating
Im einfachsten Fall können Multiple Values mit der values Funktion erstellt werden.
(values 1 2 3)
;; Returns 1,2,3 as multiple values - NOT as a list
Eine weitere Möglichkeit ist values-list
(values-list '(1 2 3))
;; Returns 1,2,3 as multiple values
Using
multiple-value-bindmultiple-values-list—> Gegenteil zuvalues-list. Übernimmt Multiple Values als Parameter und gibt sie als Liste zurück.
Wird ein Multiple Value direkt einer Variablen zugewiesen, so wird nur der erste Wert genutzt und die anderen werden verworfen:
CL-USER> (defparameter x (values 1 2 3))
X
CL-USER> x
1
CL-USER>
Limits
Es existiert eine Konstante MULTIPLE-VALUES-LIMIT, die angibt, wie groß die Anzahle der Werte sein kann, die eine Funktion zurückgibt. Laut CLHS ist sie implementierungsspezifisch und nicht kleiner als 20. Auf meinem aktuellen SBCL System ist sie:
CL-USER> multiple-values-limit
4611686018427387903
CL-USER>