classDef - hoge1e3/Tonyu2 GitHub Wiki

lang

クラス定義

Tonyu2では,1つのファイルに1つのクラスを定義します.

  • ファイル名は クラス名.tonyu という形式になります.
    • 例えば,Hello.tonyu という名前のファイルは,Hello という名前のクラスを定義します.
  • ファイル全体がクラス定義になります.クラスを定義するための構文(例えば,Javaのclass MyClass {... }など)は不要です.
  • ファイルには,次のいずれかを複数記述できます.
    • 継承宣言
    • 組み込み宣言
    • native宣言
    • メインメソッドの処理内容
    • 非メインメソッドの定義
  • 定義された(Tonyu2の)クラスは,Javascriptのいわゆる「クラス」(function+prototypeによるメソッド定義)として機能します.

継承宣言

このクラスの親クラスを設定します.ファイルの先頭に次のように宣言します

extends 親クラス名;
  • 継承宣言を省略すると,プロジェクト設定によって設定されている親クラスを自動的に継承します.
  • 親クラス名 に nullを設定すると,親クラスがないクラスになります.
  • 継承は,JavaScriptの一般的な継承の方法(このクラスを表す関数オブジェクトのprototypeが,親クラスのオブジェクトになる)で行われます.

組み込み宣言

このクラスに組み込むクラス(モジュールクラス)を設定します.ファイルの先頭,または継承宣言に続いて次のように宣言します.

includes モジュールクラス名[, モジュールクラス名...];
  • このクラスでは,組み込んだモジュールクラスがもつメソッドを利用できます.
  • 組み込みは継承とは異なり,複数のクラスを組み込むことができます
  • モジュールクラスの実体は通常のクラスと同じ方法で作成します.
  • モジュールクラスが他のモジュールクラスを組み込んでいる場合,組み込んだ先のクラスでもそれらのモジュールクラスのメソッドが組み込まれます.
  • モジュールクラスが他のクラスを継承している場合,組み込んだ先のクラスには親クラスのメソッドは追加されません.組み込んだ先のクラスで親クラスを明示的に継承する必要があります.
  • (2018-1006仕様変更)組み込みは,モジュールクラス群(このクラスのincludeに書いたクラス,およびそれらのクラスがincludeしているクラスを再帰的にたどったもの)のプロトタイプチェーンを,このクラスと親クラスとの間に挟み込む形で行われます.
    • プロトタイプチェーンは このクラス → モジュールクラス群 → 親クラス になります.
    • 親クラスがすでに組み込んでいるモジュールクラスや,複数のモジュールクラスから共通して参照されるモジュールクラスがあった場合でも,プロトタイプチェーン中には各モジュールが1回しか出現しないように構成されます.
    • instanceof演算子によって検査されるオブジェクトが,特定のモジュールクラスを組み込んでいるかどうかは判定できません.
    • is 演算子により,あるオブジェクトが特定のモジュールを組み込んでいるかどうか判別できます.
    • このクラスおよび,親クラス,組み込むモジュールに同名のメソッドがある場合,プロトタイプチェーンで下(このクラスに近いほう)の階層を優先します.
    • superによるメソッド呼び出しは,親クラスだけでなく,組み込んでいるモジュールに同名のメソッドがあればプロトタイプチェーンが下のものを優先的に呼び出します.

例:次のような継承関係の場合

  • A extends B(A の親クラスはB)
  • A includes CMod,DMod(A はCMod,DModをモジュールとして組み込む)
  • CMod includes EMod
  • DMod includes FMod
  • B includes FMod

プロトタイプチェーンは,A→DMod→CMod→EMod→B→FModになります

native宣言

native宣言は,Tonyu2のプログラムからJavascriptのネイティブオブジェクトにアクセスするために用います.ファイル中で次のように宣言します.

native 変数名;
  • 指定された変数名を,このファイル中ではJavascriptのトップレベルスコープ(一般的にはwindowオブジェクト)に定義されている変数の値として扱います.
  • 親クラスに書いてあるnative宣言は子クラスには適用されません.必要に応じて子クラスにも同じnative宣言を書く必要があります.

メインメソッドの定義

ファイルのトップレベル(メソッド定義に囲まれていない部分)に書かれた文はメインメソッドの内容として定義されます. メインメソッドは,mainという名前を暗黙的にもちます.引数を受け取ることはできません.

Actorクラスなどでは,オブジェクトが出現してから停止するまでの動作を記述するのに用いられます.

非メインメソッドの定義

非メインメソッドは,ファイルのトップレベルにおいて次の形式で定義します.

function メソッド名(引数リスト) {
   処理内容
}

※function の代わりに \ が使用可能です(拡張構文参照)

プロパティの定義

プロパティ(getter/setter)は次の書式で定義します

//getter
\プロパティ名 {
  処理内容
}
//setter
\プロパティ名=値 {
  処理内容
}

\myProp {
   print("Get myProp="+_myp);
   return _myp;
}
\myProp=value {
   print("Set myProp to "+value);
   _myp=value;
}
myProp=10; //  Set myProp to 10
x=myProp;  //  Get myProp=10

変数の種類

  • 引数
    • 1つのメソッドに渡される値です.メソッド宣言の引数リストに記述されます.1回のメソッド呼び出しが終わると破棄されます.
  • ローカル変数
    • 非メインのメソッド宣言の処理中でvar またはlet で宣言されます.1回のメソッド呼び出しが終わると破棄されます.
  • グローバル変数
    • 名前が$で始まる変数はグローバル変数です.すべてのTonyu2オブジェクトから直接参照できます.
    • JavascriptからはTonyu.globals.グローバル変数名で参照できます.
  • クラス変数
    • 現在のプロジェクトおよび標準ライブラリで定義されているクラス名と同じ名前の変数はクラス変数です.そのクラスをあらわす関数オブジェクトを参照します.
    • JavascriptからはTonyu.classes.クラス変数名で参照できます.
  • native変数
    • native宣言によって宣言された名前の変数です.Javascriptのトップレベルスコープにおける同名の変数を参照します.
    • 次の変数はnative宣言をしていなくてもJavascriptのトップレベルスコープにおける同名の変数を参照します:Array String Number Boolean Object RegExp Error Date Promise
  • 束縛されたメソッド
    • このオブジェクトがもつメソッドと同じ名前の変数で、後ろに引数リスト()を伴わない場合、この変数はこのオブジェクトに束縛されたメソッドになります。この値は関数オブジェクトであり、呼び出し方にかかわらずこのオブジェクトをthisとして呼び出します。
    • 後ろに引数リストを伴う場合、束縛を行わず即時にこのオブジェクトの同名のメソッドを呼び出します。
  • フィールド
    • そのクラスのオブジェクトがもつ値です.
      • 上のどれにもあてはまらない変数はフィールドとして解釈されます.
      • プロジェクトオプションで,「フィールド宣言を明示的に行う」を有効にしている場合や,ソースコード中に"field strict"; という文がある場合,mainメソッド中で var myField; let myField; のように宣言したものがフィールドとして解釈されます.宣言がない場合はコンパイルエラーになります.
        • このオプションが有効の場合でも, ドット演算子による任意のフィールドへのアクセスは可能です.例えばfooを宣言せずに使用するとエラーになりますが,this.foo と書いた場合はエラーになりません.
    • Javascriptではいわゆるthis.xという形式で参照されるものです.Tonyu2でもこの方式でも参照できます.

MyClass

extends Actor;
native alert;
// メインメソッド
x=3;
rate=5;
y=mult(x);
alert(y); // 15
// メインメソッド終わり
\mult(a) {
  var res=a*rate;
  return res;
}
  • クラス名はMyClass
  • 親クラスはActor
  • Javascriptの alert 関数を利用する
  • x,rate,y はフィールド
  • multメソッドを定義
    • aは引数,resはローカル変数,rateはフィールド

.

Backlink