先日示したコード
play_songs(Socket, Pid, I) -> {Bin, Header} = rpc(Pid, next_block), write_data(Socket, Bin, {I, Header}), play_songs(Socket, Pid, I+1).
これは形式的には「外部イテレータ」のように見える。
そして「内部イテレータ」の形式に書き換えることもできる。
play_songs(Socket) -> each_song_block(fun(Bin, Header, I) -> write_data(Socket, Bin, {I, Header}), I+1 end, 0).
この場合は別プロセスを立ち上げる必要は無い。逆に考えると、プロセスとメッセージパッシングの考え方を用いることで、内部イテレータ(的な処理)を外部イテレータ(的な処理)に書き換えることができる……と言えそうである。
内部イテレータを外部イテレータに、という話題では、確か「コルーチン」が云々という議論があったはず……と思って検索してみたら、案の定興味深いページがいろいろと見つかった。
マルチプロセスとメッセージパッシングによる真の並列性を備えたErlangならば、コルーチンと同等の構造も容易に作れる……という理解で良いのだろうか。