ループ変数
ループ変数を使ったことのないプログラマは居ないだろう。(たぶん)
でも、ループ変数って何気なく使っているようで、実はややこしいナマモノである。
よって、ループ変数に関して適当に書き連ねる。
手続き型言語
ループ変数は、手続き型言語の繰り返し処理を制御するのに使われる。
単にループ変数といっても、これを読み解くと、異なる意味が混在している。
- 扱うデータを指し示している
- プログラムの状態を指し示している
- データそのものを表している
思い付いたのは以上三つ。
大体同じな気がするが、実際のところそんな単純でもない。
プログラムの状態を指し示すループ変数
コイツは要するにフラグ。
抽象化すればオートマトンになりそうな感じ。
ある条件を満たすまでループなんてのは、受理されるまで動き続けるオートマトン以外何者でもない。
イテレータはデータ構造の中のデータを指し示すのだが、
コイツは指してる対象がプログラムの論理的な状態なのでイテレータっぽくない。
しかしデバッグしづらい・バグを誘発しやすい、キケンな変数である。
あんまりお目にかかりたくない。
データそのものを表すループ変数
こいつはこれだっていう抽象化した名前を知らない。
前にあげた二つがくっついたような感じだから、説明もしづらい。
覆面算をとくために回すループ変数はコイツかもしれない。
こいつもイテレータに似てるが、
しかし変数の表現自体が値なので、別に何かを指してるわけじゃない。
変なヤツ。
in 関数型言語
手続き型言語だとこんな感じだが、関数型言語だとどうだろう。
関数型言語はループを再帰で書く(らしい)。ループ変数なんて使わない(ようだ)。
しかし、それでもループ変数を意味する存在はある。
何かって言うと、それはスタックそのものである。
スタック自体が状態変数であり、ループ変数であり、同時にデータである。
ループを進める事に相当するのは再度の再帰かreturnで、処理に相当するのは関数の中身そのものである。
手続き型言語では、ループは独立して存在するが、関数型言語ではループ=関数なわけだ。
関数型言語がプログラムの構造化を助けるような気がするのは、プログラムの基本要素である繰り返し処理が、
必ず関数化(すなわち抽象化)されて別のところに置かれるという性質から来るのかもしれない。
個人的には手続き的ループより、関数的なループのほうが確かに分かりやすい。