なぜ入力が混ざると関数の形をキープできなくなるのか

 関数の形をキープできないと戻り値が使えなくてとても不便だ。がんばったら関数の形をキープできるのか、キープできたとしてデリゲートかなんか使ったイベント駆動より分かりやすく出来るのか。そもそもなんで入力が混ざると関数の形が崩れてしまうのか。

 関数は入力が同じなら出力も同じになるものを基本としている。入力は最初に一斉に入れられる。入力が入れられた後に新たに入力が行われても、それが出力に反映されるのは問題が多い。

 でもそれは本質じゃないだろう。関数を止め、入力を待った後関数を再開することもよくやられている。何によってそれが出来なくなってしまうのか。

 関数の本義にのっとるなら、ユーザーによるマウスクリックのような入力があったらそれを引数に入れて新たに関数が開始されるのが当然だ。しかしその処理結果である戻り値は、どこかに「処理が止まっている関数」がないと受け取れない。処理結果を大域データに入れとくことも出来るがそれは関数が否定してきた手法だ。

 入力のタイミングを関数側が指定出来るなら、関数をとめて入力を待つことが出来る。GUIアプリなら常に入力は可能にしておくものだが、入力待ちから入力待ちまで一瞬で以降出来るならそれで問題はない。

 入力を待ったとして入力を処理した結果の戻り値が使われないなら関数を止めた意味はあまりない。関数が全部終わったあと入力を待ってもいいし、入力を待ってから関数を起動する方がより自然だろう。

 関数はなんらかの一個の処理をするもので、処理に必要なデータは一つの型として記述できる。それ以上でもそれ以下でもない一つのデータが一つの処理には必要だ。入力による処理がその情報のうちの一部を戻り値で与えてくれるなら関数を止めて入力を待つべきだ。

 しかしその場合だけじゃない。入力はそれに応じた様々な処理を引き起こす。関数に必要でない情報を返す処理を行っても別にかまわない。俺が問題にしたいのは、あるフレームワークがバーチャルメソッドを呼び出し戻り値を必要とするのだが、そのバーチャルメソッドがGUIからの入力を必要とする時、スレッドを止めるしかなくなる。これが何の問題もなく進むことを保障できるかどうかという問題だ。