- Javascript っぽい新しい言語を妄想してみた
- Javascript っぽい新しい言語を妄想してみた【配列編】 ← イマココ
- Javascript っぽい新しい言語を妄想してみた【マップ編】
あらすじ
「もしも自分が Javascript っぽい言語をゼロから設計するとしたら?」というテーマで以下のような言語を作ってみました. (名前はまだない)
- 基本的な文法は Javascript と同じ.
- オリジナルの Javascript が「プロトタイプベース」なのに対し, この言語は「クラスベース」なオブジェクト指向.
- すべての値がオブジェクトである. 「スカラー型」あるいは「プリミティブ型」のような概念は存在せず, すべての値が何らかのクラスのインスタンス.
- すべてのクラスは Class クラスのインスタンス. (※新しいクラスの定義は
new Class()
で行う) - 関数の表記はオリジナルの Javascript と同じだが, 引数や返り値のタイプヒンティングを付与することも出来る. (この辺りは Javascript よりもむしろ PHP7 に近い)
詳しいコードは 前回の記事 をご覧ください.
そして前回の記事でコメントくださった方々ありがとうございました! やっぱり似たようなポリシーを持つ言語は色々あるようで.
特に Ruby の仕様について詳しく調べてみたところ, 「すべての値がオブジェクト」・「クラスや関数を含めたすべての値を『第一級オブジェクト』として扱う」あたりの設計思想は Ruby そのまんまなのですね.
(失礼ながら「括弧がなくて end が一杯」・「Javascript の prototype 汚染のように Mix-in を利用して既存のクラスの振る舞いを好き勝手に変えられる」ぐらいの事前知識しか持ち合わせてませんでした)
今回は引き続き配列型について説明します.
基本形
基本的に Javascript と同じ文法で書けます.
var arr = [1, 3, "hoge", 7, "fuga"];
console.log(arr[3]); // 7
また, 配列は Array クラスのインスタンスなので以下のようにも書けます.
var arr = new Array();
arr.push(1);
arr.push(3);
arr.push("hoge");
arr.push(7);
arr.push("fuga");
console.log(arr[2]); // "hoge"
ジェネリック (総称)
これだけだと Javascript とほぼ同じですが, この言語特有の仕様として, 配列に含まれる要素の型を制限することが出来ます.
Java や C# における「ジェネリック (総称)」を表現したものです.
var arr = new Array(Integer); // コンストラクタの第一引数に Class クラスのインスタンスを指定する
arr.push(1);
arr.push(3);
arr.push("hoge"); // Integer 以外の型を push しようとしたので実行時エラー
以下のようなシンタックスシュガーを使って同じことが表現できます.
var arr = <Integer>[1, 3, 7];
arr.push(5);
arr.push("hoge"); // 実行時エラー
ちなみに型を指定しない場合は Object
を指定したのと同じ意味になります.
var arr1 = new Array();
var arr2 = new Array(Object);
console.log(arr1 == arr2); // true
var arr3 = [1, 3, "hoge", 7, "fuga"];
var arr4 = <Object>[1, 3, "hoge", 7, "fuga"];
console.log(arr3 == arr4); // true
(余談: ==
は 2 つの値が「等価」の場合に true となる演算子です. 「同一」かどうかを調べる場合は ===
を使用します)
以上で配列編は終了です. 次回は マップ編 です.
P.S. GitHub にリポジトリを立てて, 言語仕様を README にしたためようと思うのですが, 何かよさげな名前がないかと考え中...