データタイプ


■ 基本データタイプ

 基本データタイプには、32ビット符号付き整数、文字列の2種類があります。
 整数は普通に10進数文字列か、先頭に "0x" を付けた16進数文字列です。
 文字列はダブルクォートまたはシングルクォートで文字列そのものを括ります。 文字列が行をまたぐことはできません(長〜い文字列を記述したい時は、連結演算子+をご利用ください)。

    console.writeln(100);
    console.writeln(0x100);
    console.writeln("100");
    console.writeln("じゅげむじゅげみごこうのぺけぺけあとはしらない"+
                    "じゅげむじゅげみごこうのぺけぺけあとはしらない"+
                    "じゅげむじゅげみごこうのぺけぺけあとはしらない"+
                    "じゅげむじゅげみごこうのぺけぺけあとはしらない");

■ 複合データタイプ

 基本データの集合を扱うための複合データタイプとして、配列、マップ、オブジェクトがあります。
 配列は要素を0から始まるインデックスで指定するものです。表記は、"配列名 [ インデックス ]" です。

    var array;
    for(var i=0;i<10;++i)
        array[i] = i;
    for(i=0;i<10;++i)
        console.writeln("array[" + i + "] = " + i);
 後でもう一度説明しますが、ViViScript の変数はルーズに型付けされいて、かつ配列、マップ、 オブジェクトの要素は動的にメモリが確保されるので、上記のような記述が可能です。ただし、 array[1000] = 1; を実行すると、その時点でインデックス0から1000までの領域が確保されるので、 安易に大きな添え字を使ってデータを設定しないようにしてください。またインデックスは0以上で、 マイナスの値(または 2^31 以上)は無視されます。

 配列は数値でデータを指定しますが、文字列をキーにデータを参照するのがマップです。 連想記憶と呼ばれることもありますが、名前ほど大袈裟なものではありません。表記は配列と同じで、 カッコの中で数値ではなくキー文字列を指定します。

    var map;
    map["name"] = "たけちゃん";
    map["age"] = 33;
    var key = "name";
    console.writeln("map[" + key + "] = " + map[key]);
    key = "age";
    console.writeln("map[" + key + "] = " + map[key]);

実行結果:

    map[name] = たけちゃん
    map[age] = 33

 オブジェクトはプロパティを持ちます。プロパティを参照する時はピリオドに続けてプロパティ名を指定します。 これは、マップと同じことの異なる表記ですが、(通常)マップはキーの値が実行時に決まるのに対し、 オブジェクトの場合はコンパイル時に決定しているところが異なります。

    var map;
    map.name = "たけちゃん";
    map.age = 33;
    console.writeln("map.name = " + map.name);
    console.writeln("map.age = " + map.age);
 この例の様に、オブジェクトのプロパティのインスタンスは実行時に動的生成されます (この言語仕様は JavaScript とは異なるので注意してください)。したがって、
    function newPerson(name, age)       //  新しいオブジェクトを生成する関数
    {
        var person;                     //  オブジェクトを生成
        person.name = name;
        person.age = age;
        return person;                  //  生成したオブジェクトをリターン
    }

    function main()
    {
        var h = newPerson("はっしー", 29);
        var k = newPerson("すえつぐ", 36);
        console.writeln(h.name + "は" + h.age);
        console.writeln(k.name + "は" + k.age);
    }
というプログラムが可能です。JavaScript の new と this を使ったプログラムよりすっきりしていると思いませんか?
 また、JavaScript のオブジェクトは常にポインタですが、ViViScript のオブジェクトは基本的に実体です。 従って、オブジェクトをコピーしたものを更新すると、JavaScript ではソースの方のデータも更新されますが、 ViViScript ではコピー先のみが更新されます。
    var src, dst;
    src.prop = 1;
    dst = src;
    dst.prop = 2;
    console.writeln("src.prop = " + src.prop);
    console.writeln("dst.prop = " + dst.prop);

の実行結果は以下のようになります。

    src.prop = 1
    dst.prop = 2

■ 特殊タイプ

 特殊タイプとしてドキュメント、ビューがあります。 ドキュメントはファイルから読み込んだメモリイメージそのものを表し、ビューはそのUI・表示形態です。 組み込み関数やメソッドによってはこれらのタイプのインスタンスを返します。
 たとえば openDocument() はファイルダイアログを開きドキュメントをオープンし、 そのドキュメントを値として返します。

    var doc = openDocument();
    if( doc.isKindOf(7) ) {                 //  ファイルをオープンした場合の処理
        var pathName = doc.getPathName();   //  オープンしたドキュメントのフルパスを取得
        .....
    } else {
        .....                               //  オープンしなかった場合の処理
    }

■ タイプの判定

 isKindOf(type) メソッドでオブジェクトのクラスを判定することができます。 具体的に言えば、オブジェクトが整数なのか文字列なのか、それともドキュメントなのかを判定できます。