オブジェクト間の自動再計算

"//"から始まる階層構造に含まれるオブジェクトは、オブジェクト間を参照演算子(&=)で接続することにより、演算子の右辺の値の変化に連動して自動的に左辺の値を再計算する事ができます。

参照演算子の使い方

例 ウィンドウのサイズにあわせてボタンの表示位置を調整

Form Form1 {
    width  &= //.width;
    height &= //.height;
    Button Button1 {
        x &= Form1.width / 5;
        y &= Form1.height / 5;
        width &= (Form1.width / 5) * 3;
        height &= (Form1.height / 5) * 3;
    }
}

"//"(Rootオブジェクト)の直下にあるForm1は、ウィンドウのサイズ変更に自動的に追従し、widthとheightプロパティが変化します。

この例では、Button1のx、y、width、heightを&=演算子でForm1のwidthとheightに関連させているので、ウィンドウのサイズ変更に追従して、Button1の表示位置と大きさが変化します。


例 TextBoxのエラー表示

Form Form1 {
    width = 500;
    height = 400;
    TextBox Text1 {
        x = 10;
        y = 10;
        width = 100;
        height = 30;
        bgColor &= (Err == 0 ? Color.STD : Color.RED);
        Number Err {
            value = 0;
        }
    }
    Button Button1 {
        x = 10;
        y = 50;
        width = 100;
        height = 30;
        function onTouch(e) {
            if (Form1.Text1 == "") {
                Form1.Text1.Err = 1;
            } else {
                Form1.Text1.Err = 0;
            }
        }
    }
}

この例では、Button1を押したときに反応するイベントハンドラにより、Text1の内容が空であればForm1.Text1.Errに1を、空でなければ0を設定しています。

Text1の背景色は &= 演算子によりErrに関連しているので、Errに1がセットされたときに、赤く反応します。


このように参照演算子 &= を利用することで、スクリプトを「背景を赤くする」という処理ではなく、「エラーをセットする」というより本質的な処理で記述することができるようになります。

参照演算子の制約

右辺に更新動作を伴う式や関数を記述することはできません

参照演算子の右辺に更新操作を伴う式を記述すると、関連性の依存関係が非常に複雑となるため、CRSではサポートしていません。更新操作を伴う演算子とは++や--演算子などが該当します。


右辺にユーザ定義関数を記述することはできません

参照演算子の右辺にFunctionで定義するユーザ定義関数を記述することはできません。


依存関係の解析は、右辺に出現するシンボルにより行われます

参照演算子の右辺には、更新動作を伴わないグローバル関数やメソッドを記述することができます。

CRSインタプリタは右辺に出現するシンボル(オブジェクト名やプロパティ名)を頼りに依存関係を管理しているので、メソッドの呼び出しにより2次的に変化する値を右辺に記述した場合、再計算が実行されないことがあります。