昨日、継続渡しの練習で partition という手続きを書いた。
同じ名前の手続きが SRFI-1 ライブラリに定義されている。けど、ちょっと動作が違う。
gosh> (use srfi-1) #<undef> gosh> (partition odd? '(1 2 3 4 5)) (1 3 5) (2 4)
(1 3 5) と (2 4) がひとつのリストに入っているんじゃなくて、2行にわたって表示されている。実は、SRFI-1 の partition は2つの値を返している。partition のように2つ(あるいはそれ以上)の値を返すことを「多値」というらしい。
cf. Scheme:多値
多値を返すには values を使う。
gosh> (values 'foo 'bar 'baz) foo bar baz
一方、多値を受け取るには receive が使える。
gosh> (receive (odds evens) (partition odd? '(1 2 3 4 5)) (print odds)) (1 3 5) #<undef>
odds と evens が返される多値に束縛される変数だ。必要がないからといって、数を合わせないとダメらしい。
gosh> (receive (odds) (partition odd? '(1 2 3 4 5)) (print odds)) *** ERROR: received more values than expected Stack Trace: _______________________________________
ふーん、なんとなくわかった(ような気がする)けど、ちょっとピンとこないな。