Common Lispでは、関数は1つの値だけでなく、複数の値を返すことができます。
たとえば、ゼロに向かって切り下げるfloorは2つの値を返します。1つ目は切り下げた値で、2つ目は余りです。
(floor 3.5) ; => 3
; 0.5
(複数の戻り値は、出力では別々の行に表示します。)
関数に複数の値を返させたいときは、valuesアクセサーを使います。
(defun three-numbers () (values 1 2 3))
(three-numbers) ; => 1
; 2
; 3
返したい値のリストがあるときは、value-listが使えます。
(values-list '(a b c)) ; => a
; b
; c
1つ目の値だけが必要なら、特別なことは何もする必要はありません。言語がうまく処理してくれます。
(+ (values 1 2 3) (values 10 20 30)) ; => 11
ただし、それ以外の値にアクセスしたい場合は、いくつかの関数を使う必要があります。
主なマクロはmultiple-value-listとmultiple-value-bindの2つです。
これらは、複数の値を返すものを包み込んで、すべての値を取り出すために使います。
1つ目は、すべての値のリストを作ります。
2つ目は、それぞれの値に変数を束縛できます。
(multiple-value-list (values 1 2 3)) ; => (1 2 3)
(multiple-value-bind (a b c) (values 1 2 3)
(+ a b c)) ; => 6
a、b、cという変数は、multiple-values-bindの内側でのみスコープに入ることに注意してください。
もう1つ便利なマクロがnth-valueです。これはリストに対するnthと同じように、複数の値の中から「n番目」の項目を返します。
(nth-value 0 (values 1 2 3 )) ; => 1
(nth-value 1 (values 1 2 3 )) ; => 2
(nth-value 2 (values 1 2 3 )) ; => 3