コンパイラ版とインタプリタ版の違い その 2

さてさて、コンパイラ版とインタプリタ版のつづきです。

前回の違いはそれなりに知られていることですが、今回は結構知られてないんじゃないかなぁ。

複数要素変数の定義

複数要素変数というのは、いうなれば配列です。ただ、JavaFX Script では複数要素変数でも、単一要素を代入することもできるので、配列というのとはちょっと違います。でも、書くのが面倒くさいので、以後は配列と書きます。

インタプリター版の時、配列は次のように定義します。

var array1:Integer* = [1, 2, 3]; // 要素数が 0 以上
var array2:Integer+ = [1, 2, 3]; // 要素数が 1 以上

普通は * を使うことが多いですね。

で、現状の コンパイラ版のスペック を読むと...
* や + を使うと記述してあるところと、[] を使うと記述してあるところがあります。

attribute のところでは

Multi-valued attributes (i.e. those declared with the * or + cardinality specifiers) are represented as arrays.

variable の sequence のところでは

Sequence types are declared with the [] annotation:

と記述されています。

ところが実際に試してみると [] しか使えないことが分かります。

var array:Integer[] = [1, 2, 3];

なんだかなぁ ^^;;

型名省略の廃止

インタープリター版では型が推定できるところは省略できたところがあるのですが、コンパイラ版では型省略ができなくなってしまいました。

たとえば、インタープリター版では次のようなコードが書けました。

Rect {
    transform: rotate(20, 0, 0)
    fill: blue
    x: 50, y: 30
    width: 100, height: 50
}

このコードは青い四角形を 20 度回転させるというコードです。

transform アトリビュートの型は Transform クラスなので、Transform クラスの派生クラスである Rotate クラスの rotate メソッドを直接記述できます。

fill アトリビュートの型は Color クラスなので、Color クラスの定数 blue を直接記述できます。

これに対し、コンパイラ版では次のように記述します。

Rect {
    transform: Transform.rotate(20, 0, 0)
    fill: Color.BLUE
    x: 50, y: 30
    width: 100, height: 50
}

赤字で示しているように、メソッドや定数の前にクラスを記述しています。つまり、型の省略ができなくなってしまったわけです。

この点に関しては、インタープリター版の記述方法の方がさくらばは好きですね。

今日はここまで。