for-eachのシンタックスがカオスすぎる。
高木です。こんばんは。
油断していると、もうこんな時間になってしまいました。
今日はまだ誰も投稿していないようなので、遅い時間ですが投稿したいと思います。
(と、思いましたが、書いている最中に吉田が投稿したようです)
昨日、JavaScript(というかECMAScript)には多数の規格バージョンと多数の方言があるということを書きました。
それ以前に、JavaScript自体もCの流れを汲むプログラミング言語の方言のようなものです。
私が普段関わるプログラミング言語には、そうしたCの流れを汲むものがたくさんあります。
CやC++はもちろん、C#、Java、PHP、そしてJavaScriptです。
これらを見ていると、Cも含めて、シンタックスのルーツは初期のC++ではないかと思います。
そして、もう少し新しいC++(ARMあたり)のシンタックスを、C以外の各言語は踏襲しているように思います。
逆にいえば、それ以降に追加された機能は、各言語でバラバラのシンタックスを持っており、まったく統一感がありません。
具体的にいうと、関数原型、if文、switch文、for文、do文、while文、break文、continue文、return文、tryブロック、throw式などがそうです。
演算子に関しても当てはまると考えてよいでしょう。
一部最初の時点で揺らいでいるところもあります。
それは、for文の第1節で宣言した変数の有効範囲です。
ARMの仕様では、for文の第1節で宣言したオブジェクトの有効範囲は、そのfor文を含むブロックの最後まででした。
しかし、現在使われているCもC++もJavaもC#も、for文の中にしか有効範囲が及びません。
一方で、スクリプト言語であるPHPやJavaScriptでは、ローカル変数は関数スコープだということもあり、結果的にARMとほぼ同じように振舞うことになります。
また、C++の最初の標準規格では、forの第2節のほか、if文、switch文、while文でもカッコ内で宣言が可能になっています。
たとえば次のようにです。
1 2 3 4 5 | while (int c = *s) { std::putchar(static_cast<unsigned char>(c)); ++s; } |
これはどうやら不人気だったようで、Cにもバックポートされていないようです。
まあ、PHPなんかは、それらの場所で強引に変数を作ってしまうことはできますが……。
前置きが長くなりました。
ここからが本題です。
分化後に追加されたと思われるシンタックスの代表格がfor-eachではないかと思います。
呼び方は言語ごとにマチマチですが、配列等の要素を順に抽出していくためのシンタックスです。
PHPにforeachが導入されたのはPHP 4からで、PHP 4が登場したのは2000年です。
シンタックスは次のようになり、配列$listから要素$eを順に取り出します。
1 2 3 | foreach ($list as $e) { } |
連想配列の場合は、次のようにすることで、各要素のキーと値を同時に取り出せます。
1 2 3 | foreach ($list as $key => $value) { } |
なんか、非常に長文になってきましたし、まだまだ終わる気配がありませんので、いったん切ります。
続きは明日の朝です。