CRS言語仕様改訂履歴

Biz/Browser DT 1.0.0以降のCRS言語仕様の改訂履歴は下記の通りです。

Biz/Browser DT 1.0.0 における Biz/Browser V からの CRS言語仕様差異

  • 単一行コメントを導入しました。

    • [例] var a = 100; # ここはコメントです

  • プラグマ指定が#記号から@記号に変更となりました。

    • [例] #resource → @resource

  • プラグマ指定の追加/廃止を行いました。

    • [追加] @encoding “utf-8” # CRSファイルのエンコーディング指定(AI、SDで導入済み)

    • [追加] @resource “/resource” #リソースファイルの位置指定

    • [削除] @agent

    • [削除] @crs

  • null結合演算子 が追加されました。

  • “&&”、”||”演算子 が短絡評価(ショートサーキット)されるようになりました。

  • パッケージの概念を拡張した 名前空間 を導入しました。

  • ユーザー定義クラス にプロパティおよびクラス定数を定義出来るようになりました。

  • ユーザー定義クラス に定義された関数がビルトインのメソッドと同様に扱われるようになりました。

  • ユーザー定義クラス にスタティックメソッドを定義出来るようになりました。

  • ユーザー定義クラス の配列化を許可しました。

  • ラムダ式(クロージャ)を記述できるようになりました。

    # 最もシンプルなラムダ式
    var hoge = lambda(){};
    hoge(); # ラムダ式呼び出し
    
    # ラムダ式の中から外のthisをキャプチャし参照する
    Form form1 {
      Function onTouch(e) {
        var hoge = lambda[/*thisをselfの名前でキャプチャ*/self = this] ()
        {
          MessageBox(self.name);  # "form1" が表示されます。
          MessageBox(this.name);  # "root" が表示されます (ラムダ式内のthisは常にルートオブジェクトを指します)。
        };
        fuga(hoge); # ラムダ式呼び出し
      }
    }
    
  • 配列オブジェクトに対するメソッド呼び出しを行った際、そのメソッド呼び出しが各配列要素にフォワードされるようになりました。

    ImageButton btn[2];
    btn.setImage("image.png"); # btn[0]およびbtn[1]に対し、setImage("image.png")が呼ばれます。
    

  • 汎用イベントハンドラが追加されました。

    Form form1 {
      function onEvent(e) {
        if(e.name == "KeyDown") {
          return true; # KeyDownイベントは伝搬を禁止
        } else {
          return false; # その他イベントは伝搬を許可
        }
      }
      function onKeyDown(e) {
          # onEventにてフィルタリングされため、このイベントハンドラは呼ばれません。
        }
    
    }
    

  • イベント名を定数として扱う仕様を廃止しました。


  • オブジェクト定義式におけるコンストラクタの記述が可能となりました。

    # Stringオブジェクト"s"を作成し、初期値"abc"をセットした後オブジェクトツリーに接続します。
    String s("abc");
    

  • 従来のtry~catchでの 例外ハンドリング に加え、finally構文が記述可能となりました。

    try {
      ...
    } catch(e) {
      ...
    } finally {
      # tryブロック内での例外発生有無にかかわらず実行されます。
    }
    
    try {
      ...
    } finally {
      # catchブロックを省略することも可能です。
    }
    

  • catchブロックにて選択式catchが可能となりました。

    try {
       ...
    } catch CRS::Common::Core::CSVDocument-1:1 (e) {
       # CSVDocument-1:1 パースエラーのみcatch
    } catch SYS-50 { # eは省略可能
       # SYS-50系(通信関連)をまとめてcatch
    } catch SYS {
       # その他SYS例外すべてcatch (Common::Core::UIなどはcatchされず)
    } catch(e) {
       # もちろん従来通りの方法でもcatch可能
    }
    

Biz/Browser DT 1.1.0 における Biz/Browser DT 1.0.0 からの CRS言語仕様差異

  • 関数の引数にスコープを伴うnew式が記述できるようになりました。

    # Eventオブジェクトを新たに生成し、そのオブジェクトの子オブジェクトを生成/接続した後
    # イベントを発行します。
    postEvent(
      new Event("TestEvent"){
        Number x = 10;
        Number y = 20;
      }
    );
    

  • var変数の型を指定する構文が追加されました。

    var num : Number = 123; # numはCRS::Common::Core::Number型、値は123 (数値)
    var str : String = 123; # strはCRS::Common::Core::String型、値は"123" (文字列)
    

  • クラス定数の定義に定数だけでなく任意の式を記述できるようになりました。

    namespace ns1 {
      const const1 = 123;
    }
    print(ns1.const1); # "123"と出力されます
    

  • 名前空間に定数の定義が可能になりました。また、名前空間に定義された定数へ名前空間の装飾付き(Namespace.$CONST)アクセスが可能になりました。

    namespace ns1 {
      const $const1 = 123;
    }
    print(ns1.$const1); # "123"と出力されます
    

  • '(シングルクォート)での文字列リテラルの指定が可能になりました。

    var str1 = "abc"; # 従来の文字列リテラル記法
    var str2 = 'def'; # 新しい文字列リテラル記法
    

  • 文字列リテラル にて、JavaScript互換の文字を表すエスケープシーケンス(xXX, uXXXX, u{...})が指定可能になりました。

    printf("\u{31}\u{32}\u{33}\u{29E3D}"); # "123𩸽"と出力されます。
    

Biz/Browser DT 1.2.0 における Biz/Browser DT 1.1.0 からの CRS言語仕様差異

  • メソッドや関数の引数に渡す引数をArrayオブジェクトから展開できるようにする構文「パラメータパック展開構文」が記述できるようになりました。

    function f(a, b) {
      return a + b;
    }
    var arr = new Array();
    arr[0] = 1;
    arr[1] = 2;
    var c = f(arr...); # 配列要素を引数として展開
    print(c); # "3"が出力されます
    

  • クラス名にエイリアスを指定可能な文法「using class <AliasName> = <ClassFullName>」が追加されました。

    using class Math2 = CRS::Common::Core::Math; # Math2という名称をMathクラスの別名として設定
    print(Math2.PI); # Math.PIと同様のコードとして扱われます。
    

  • 継承関係と独立したインタフェースを定義可能な「mixin class B」定義とそのインタフェースを継承する「class A mixin B」文法が追加されました。


  • ユーザークラス定義で添字演算子"[]"のオーバーライドと、イテレータ定義によるfor in文への対応が可能になりました。


  • ユーザ定義クラスにて、オブジェクトが配列化された時のみ有効となるプロパティ、メソッドの定義が可能になりました。

    namespace ns1 {
      class ClsA {
        # 配列オブジェクトでのみアクセス可能なプロパティです。
        property prop[...] { get { return "abc"; }}
        # 配列要素でのみアクセス可能なプロパティです。
        property prop[] { get { return "def"; }}
      }
    }
    
    var arr = new ns1::ClsA[3]; # ユーザ定義クラスの配列オブジェクトを作成
    print(arr.prop); # "abc"が出力されます。
    print(arr[0].prop); # "def"が出力されます。
    

  • using constステートメントで名前空間定数およびクラス定数をusing指定出来るようになりました。

    using const CRS::Commom::Core::Math.PI; # クラス定数PIをグローバル定数として使用可能にします。
    print(PI); # 円周率が表示されます。
    

  • CSV定数 で"CSV"キーワードを省略した場合(a << {b,c,d})は暗黙でCSV定数定義と見なすようになりました。

    CSVDocument doc << { a, b, c}; # この場合、'<<' 演算子の右辺はCSV定数と扱われます。
    


  • 数値リテラル を記述する際、".5"のように整数部を省略した記述が可能となりました。

    var num = .5; # 変数numには浮動小数点数0.5が格納されます。
    var fix = -.123F # 変数fixには固定小数点数-0.123が格納されます。