多値

R5RSには多値を返す関数があるのだが、その使い方は取ってつけたような印象がある。元々の構文では多値という扱いが想定されていないからだろうか。
多値を返す関数を珍しく感じるのはcやjavaに慣れていることだけが理由ではなく、「関数」という語本来の用法である数学の関数も一つの値を返すものばかりを扱っているのも大きいのかもしれないが、実装の面から考えると関数が多値を受け取る処理と多値を返す処理はほとんど同じであり、大半のプログラミング言語に多値を返す関数が存在しない理由は「適当な構文がない」という点に尽きる。*1

再び数学における関数を考える。例えば、ベクトルで値域を定義した関数は値の組を返すのだから、振る舞いとしては多値関数と似ている。ただし多値関数では返り値の線形性が保障されていないので、値の組という一つの値=Tupleを返す関数として定義すればよいだろう。引数も同様にTupleとして扱うことで全ての関数を1入力1出力化することが出来る。

int plus(int x, int y);
(int, int) divide(int x, int y);

もちろん、Tupleに相応するオブジェクトやリストを返す関数でも全く同じ機能を達成することが出来る。

*1:だらだらしてるな。