ループ変数

ループ変数を使ったことのないプログラマは居ないだろう。(たぶん)
でも、ループ変数って何気なく使っているようで、実はややこしいナマモノである。
よって、ループ変数に関して適当に書き連ねる。

手続き型言語

ループ変数は、手続き型言語の繰り返し処理を制御するのに使われる。
単にループ変数といっても、これを読み解くと、異なる意味が混在している。

  1. 扱うデータを指し示している
  2. プログラムの状態を指し示している
  3. データそのものを表している

思い付いたのは以上三つ。
大体同じな気がするが、実際のところそんな単純でもない。

扱うデータを指し示すループ変数

配列インデックスとかポインタとかはコイツ。イテレータに抽象化できる。
普通、素直なループの終了は同型のイテレータと比較する。
普段見かけるループ変数は大抵これ。

プログラムの状態を指し示すループ変数

コイツは要するにフラグ。
抽象化すればオートマトンになりそうな感じ。
ある条件を満たすまでループなんてのは、受理されるまで動き続けるオートマトン以外何者でもない。
イテレータはデータ構造の中のデータを指し示すのだが、
コイツは指してる対象がプログラムの論理的な状態なのでイテレータっぽくない。

しかしデバッグしづらい・バグを誘発しやすい、キケンな変数である。
あんまりお目にかかりたくない。

データそのものを表すループ変数

こいつはこれだっていう抽象化した名前を知らない。
前にあげた二つがくっついたような感じだから、説明もしづらい。
覆面算をとくために回すループ変数はコイツかもしれない。
こいつもイテレータに似てるが、
しかし変数の表現自体が値なので、別に何かを指してるわけじゃない。
変なヤツ。

in 関数型言語

手続き型言語だとこんな感じだが、関数型言語だとどうだろう。
関数型言語はループを再帰で書く(らしい)。ループ変数なんて使わない(ようだ)。
しかし、それでもループ変数を意味する存在はある。
何かって言うと、それはスタックそのものである。
スタック自体が状態変数であり、ループ変数であり、同時にデータである。
ループを進める事に相当するのは再度の再帰かreturnで、処理に相当するのは関数の中身そのものである。


手続き型言語では、ループは独立して存在するが、関数型言語ではループ=関数なわけだ。
関数型言語がプログラムの構造化を助けるような気がするのは、プログラムの基本要素である繰り返し処理が、
必ず関数化(すなわち抽象化)されて別のところに置かれるという性質から来るのかもしれない。


個人的には手続き的ループより、関数的なループのほうが確かに分かりやすい。