大阪市中央区 システムソフトウェア開発会社

営業時間:平日09:15〜18:15
MENU

for-eachのシンタックスがカオスすぎる。

著者:高木信尚
公開日:2018/05/27
最終更新日:2018/05/27
カテゴリー:技術情報
タグ:

高木です。こんばんは。

油断していると、もうこんな時間になってしまいました。
今日はまだ誰も投稿していないようなので、遅い時間ですが投稿したいと思います。
(と、思いましたが、書いている最中に吉田が投稿したようです)

昨日、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文でもカッコ内で宣言が可能になっています。
たとえば次のようにです。

これはどうやら不人気だったようで、Cにもバックポートされていないようです。
まあ、PHPなんかは、それらの場所で強引に変数を作ってしまうことはできますが……。

前置きが長くなりました。
ここからが本題です。

分化後に追加されたと思われるシンタックスの代表格がfor-eachではないかと思います。
呼び方は言語ごとにマチマチですが、配列等の要素を順に抽出していくためのシンタックスです。

PHPにforeachが導入されたのはPHP 4からで、PHP 4が登場したのは2000年です。

シンタックスは次のようになり、配列$listから要素$eを順に取り出します。

連想配列の場合は、次のようにすることで、各要素のキーと値を同時に取り出せます。

なんか、非常に長文になってきましたし、まだまだ終わる気配がありませんので、いったん切ります。
続きは明日の朝です。

    上に戻る