複数

複数の値 の Common Lisp

3個の演習

複数の値について

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
GitHubで編集 リンクは新しいウィンドウまたはタブで開きます

複数の値を学習する

練習はロックされています

複数の値を練習するには、あと1個の演習のロックを解除してください