class
Xtalはクラスベースを採用しています。
当初はプロトタイプベースを採用していましたが、プロトタイプベースであることの利点があまり思いつかないことや、
世の中のプロトタイプベースな言語、例えばJavaScriptやLuaでは、結局クラスもどきライブラリが何個か出現していることも考慮し、最初からクラスベースである方向を選びました。
では、classの簡単な記述例を書きます。
Car : class{ //速度 @velocity : 0; //アクセルを踏む step_on_accelerator : method(power){ @velocity += power; } //ブレーキを踏む step_on_brake : method(power){ @velocity -= power; if(@velocity<0) @velocity = 0; } // 現在の速度を返す velocity : method{ return @velocity; } // 速度を設定する set_velocity : method(value){ @velocity = value; } } //クラスを関数呼び出しするとインスタンスが生まれる car : Car(); car.step_on_accelerator(10); println(car.velocity); // 10が出力される car.step_on_break(50); println(car.velocity); // 0が出力される // car.set_velocity(99); と等価 car.velocity = 99; println(car.velocity); // 99が出力される
この例からいくつかの特徴がわかるはずです。
- インスタンス変数は@で始めること、
- メソッドはmethodを使うこと、
- 引数が無いときは()が省略できること。
- obj.member = value; はobj.set_member(value); のシンタックスシュガーなこと。
後半二つはメンバをプロパティのように扱えるようにするためにあります。
インスタンス変数には外部からさわることが出来ないので(つまり、car.@velocity とは出来ない)、このプロパティのように扱える機能は頻繁に使われます。
そのため、インスタンス変数のアクセッサを作るための短縮構文が用意されています。
velocity : @velocity; // 次の行と同じ意味 // velocity : method{ return @velocity; } set_velocity : @velocity=; // 次の行と同じ意味 // set_velocity : method(value){ @velocity = value; }