構文 - Script Language
|
1 2 3 4 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
C++と同等の組み込み型が用意されています。
| 型名 | 最小値 | 最大値 |
| int8 | -128 | 127 |
| int16 | -32768 | 32767 |
| int int32 | -2147483648 | 2147483674 |
| int64 | -92233772036854775808 | 9223372036854775807 |
| uint8 | 0 | 255 |
| uint16 | 0 | 65535 |
| uint uint32 | 0 | 4294967295 |
| uint64 | 0 | 18446744073709551615 |
| 型名 | 値の範囲 | 一番小さい正の値 | 最大桁数 |
| float | +/- 3.402823466e+38 | 1.175494351e-38 | 6 |
| double | +/- 1.7976931348623158e+308 | 2.2250738585072014e-308 | 15 |
配列の変数は次のように宣言します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
配列はC++と同様にインデクス式を使ってアクセスします。
また,配列の長さはlength()メソッドにより取得できます。
1
2
3
4
5
| - | ! | |
ユーザー定義型(クラスや列挙型)の変数はC++と同様に宣言することができます。
1 2 3 4 5 6 | |
オブジェクトハンドルとはC++でいう参照・ポインタにあたるものです。
参照先のオブジェクトは参照カウンタで寿命を管理しているため,「既に破棄されたデータにアクセスする」という不正なデータアクセスはおこりません。
もしnullなオブジェクトハンドルにアクセスしようとしたら例外が発生しスクリプトの実行が止まります。
1
2
3
4
5
6
7
8
9
10
11
| - | ! | |
ASでの文字列は8bitもしくは16bitのデータの配列として扱われます。
ASではC++と同等のエスケープシーケンス文字が用意されています。
下記がエスケープシーケンス文字をまとめた表です。
| 文字 | 値 | 意味 |
| ¥0 | 0 | null文字 |
| ¥¥ | 92 | バックスラッシュ |
| ¥' | 39 | シングルコーテーション |
| ¥" | 34 | ダブルコーテーション |
| ¥n | 10 | 改行文字 LF |
| ¥r | 13 | 改行文字 CR |
| ¥t | 9 | TAB |
| ¥xFFFF | 0xFFFF | 16bitで表した文字 |
| ¥uFFFF | 0xFFFF | unicode16bitで表した文字 |
| ¥uFFFFFFFF | ¥0xFFFFFFFF | unicode32bitで表した文字 |
文字列はダブルコーテーションもしくはシングルコーテーション(要オプション設定)で囲んで表します。
1 2 3 4 5 6 7 8 | |
C++と同様に複数の文字列を1つの文字列として連結することができます。
1 2 3 | |
ASでは"""を使うことで複数行に渡す文字列を簡単に記述することができます。
1 2 3 4 5 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
C++同様の式文が使えます。詳しくは式の項をご覧ください。
1 2 | |
C++同等のif文が使えます。
ただし,C++と異なり,C#のように条件部はbool値である必要があります。
C++と同等のfor文が使えます。
ただし,条件部はif文と同じようにbool値である必要があります。
C++と同等のwhile文が使えます。
ただし,条件部はif文と同じようにbool値である必要があります。
C++と同等のdo-while文が使えます。
ただし,条件部はif文と同じようにbool値である必要があります。
C++と同様のswitch文が使えます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| - | | | | | | | | | | | ! | |
C++と同様のreturn文が使えます。
C++と同様のスコープブロック文が使えます。
C++と同様の代入式が使えます。
1 | |
C++と同等の代入式が使えます。
ASのシフト演算はC++のものと異なり,左シフト,符号無し右シフト,符号有り右シフトの3種類のシフトが使えます。
1 2 | |
使用可能な代入演算記号は下記の通りです。
+= -= *= /= = &= |= ^= <<= >>= >>>=
C++と同様の関数呼び出しが使えます。
1 2 3 4 | |
オブジェクトハンドルの型変換の例を下記に示します。
もし,オブジェクトハンドルの型変換に失敗したらnullのオブジェクトハンドルが返されます。
1 2 3 4 5 6 7 | |
組み込み型の値の変換の例を下記に示します。
1 2 3 4 5 | |
C++と同様の算術演算式が使えます。
c = -(a + b);
| 演算記号 | 説明 | 左項 | 右項 | 結果 |
| + | 正符号演算 | - | 数値 | 数値 |
| - | 負符号演算 | - | 数値 | 数値 |
| + | 加算 | 数値 | 数値 | 数値 |
| - | 減算 | 数値 | 数値 | 数値 |
| * | 乗算 | 数値 | 数値 | 数値 |
| / | 除算 | 数値 | 数値 | 数値 |
| % | 余算 | 数値 | 数値 | 数値 |
C++と同等のビット演算式が使えます。
ASではD言語のように右シフトが2種類に増えています。
c = ~(a | b);
| 演算記号 | 説明 | 左項 | 右項 | 結果 |
| ビット反転 | - | 数値 | 数値 | |
| & | ビット論理積 | 数値 | 数値 | 数値 |
| | | ビット論理和 | 数値 | 数値 | 数値 |
| ^ | ビット排他論理和 | 数値 | 数値 | 数値 |
| << | 左シフト | 数値 | 数値 | 数値 |
| >> | 右シフト | 数値 | 数値 | 数値 |
| >>> | 算術右シフト | 数値 | 数値 | 数値 |
C++と同等の論理演算式が使えます。
ASでは,not,and,or,xorが既存の演算記号の代わり使うことができます。
if ( a and b or not c ) {}
| 演算記号 | 説明 | 左項 | 右項 | 結果 |
| not ! | 論理否定 | - | bool値 | bool値 |
| and && | 論理積 | bool値 | bool値 | bool値 |
| or || | 論理和 | bool値 | bool値 | bool値 |
| xor | 排他論理和 | bool値 | bool値 | bool値 |
C++と同様の等値式が使えます。
C++と同様の比較式が使えます。
1 2 3 4 | |
2つのオブジェクトハンドルが示すものが同じかどうかを調べる式です。
C++と同様のインクリメンタル式,デクリメンタル式が使えます。
1 2 3 4 5 6 7 8 9 10 11 | |
C++と同様のインデクス式が使えます。
添え字に使う型は,インデクス式がオーバーロードできるためオブジェクトのタイプごとに異なります。
arr[i] = 1;
C++と同等の三項条件式が使えます。
if文と同様に,条件部はbool値である必要があります。
condition ? a : b;
object.property = 1; object.method();
C++と同様にオブジェクトのメンバにアクセスできます。
ASではオブジェクトにプロパティアクセサを持つことができるため
メンバ変数にアクセスしているように見えて,実際は関数を呼び出しているということもありえます。
詳細はクラスのプロパティアクセサの項をご覧ください。
オブジェクトのハンドルにアクセスする際に頭に@をつけます。
この記号を使うことで,オブジェクトハンドルが指すオブジェクトを変更したり,参照したりします。
1 2 3 4 5 | |
C++と同様の丸括弧が使えます。
a = c * ( a + b );
C++に似たスコープ解決演算子が使えます。
::を使うことでグローバル変数・関数を指定することができます。
1
2
3
4
5
6
| - | | ! | |
オブジェクトハンドルはオブジェクトの参照を保持することができる型です。
オブジェクトハンドルを使うことで,1つのオブジェクトを複数の変数からアクセスできるようになります。
C++でいうポインタや参照と同じようなものだと考えてください。
オブジェクトハンドルの型は型名 + @で表現します。
object@ obj_h;
このコードでは,obj_hにnull参照が保持されます。
null参照が保持されている状態は,オブジェクトの参照を保持していない状態と考えてください。
オブジェクトハンドルが参照しているオブジェクトのメンバへのアクセスは
通常のオブジェクトのメンバへのアクセスと同じようにアクセスします。
object obj; object@ obj_h; obj.Method(); obj_h.Method();
もし,オブジェクトハンドルがnull参照を保持している状態でメンバへアクセスしようとすると
例外が発生し,実行中のスクリプトが停止します。
オブジェクトハンドルの変数に対して代入演算子=を使うと,
通常のオブジェクト変数に対して代入演算を記述したときと同じことが行われます。
object obj; object@ obj_h; obj_h = obj;
もちろん,オブジェクトハンドルがnull参照を保持している場合は例外が発生します。
オブジェクトハンドルが保持する参照をコピーしたい場合は@記号を使います。
object obj; object@ obj_h; @obj_h = @obj;
同一性式を使うことで,2つのオブジェクトハンドルが同じオブジェクト参照を保持しているか調べることが出来ます。
object@ obj_a, obj_b;
if ( obj_a is obj_b ) {}
if ( obj_a !is null ) {}
オブジェクトハンドルが参照するオブジェクトは
全てのオブジェクトハンドルから参照を保持されなくなった時点で解放されます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| - | | | | | ! | |
オブジェクトハンドルを使うことで基底クラス・インターフェースのへの変換やダウンキャストを実現します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| - | | | - | ! | - | ! ! | |
ASのインターフェースはC#やD言語と同等のものと考えてもらって構いません。
インターフェースにはC++でいう純粋仮想関数を宣言することができます。
ただし,C#やD言語のインターフェースとは異なり,インターフェースが他のインターフェースを継承することはできません。
その代わり,クラスは複数のインターフェースを継承することができます。
C++と同様のenumが使えます。
1
2
3
4
5
6
7
| - | | | | ! | |
ASのクラスはC++に似ていますが,仕様が異なる箇所がいくつかあるので注意してください。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| - | | - | ! | | | - ! | | | - | ! | | | - | ! | | | ! | |
ASのクラスはC++のようにアクセス修飾子(public,protected,private)が存在しません。
複数人でコーディングするときは,どのメンバが外部からアクセスしてよいメンバなのか分からなくなりますので
命名規則などを作り運用でカバーしましょう。
C++のように,コンストラクタ・デストラクタが定義できます。
デフォルトコンストラクタ,デフォルトデストラクタは定義しなければ自動生成されます。
ただ,自動で生成されるデフォルトコンストラクタは組み込み型のメンバ変数を初期化しません。
それらのメンバ変数は未初期化になるため気を付けましょう。
また,ASはC++と異なりデフォルトコンストラクタは必ず生成されるので注意しましょう。
(C++ではコンストラクタを定義するとデフォルトコンストラクタは自動生成されません)
ASのクラスはC#・D言語のように1つだけクラスを継承することができ,
インターフェースは複数実装(継承)することができます。
ASのクラスのメンバ関数は,JAVAやD言語ように全て仮想関数として宣言されます。
そのためどのメンバ関数もオーバーライドすることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | - | ! - | ! - | | | - | ! | - | ! | | | ! - | - | ! | - | ! | | - | ! ! | |
ちなみに,ASのsuperを使ったコンストラクタの呼び出し位置の制約はないようです。
(C#やD言語では先頭でしかできない仕様)
ASはC++のように演算子をオーバーロードすることができます。
演算記号に該当する関数名を実装することで演算子オーバーロードを実現できます。
| 記号 | 関数名 |
| - | opNeg |
| 〜 | opCom |
これらの演算子を定義していてコード中で演算子が使われると,コンパイル時に a.opfunc() という形に展開されます。
| 記号 | 関数名 |
| == | opEquals |
| != | opEquals |
a == bはa.opEquals(b)とb.opEquals(a)のどちらかに展開されます。
opEqualsはbool値を返す関数として定義する必要があります。
| 記号 | 関数名 |
| < | opCmp |
| <= | opCmp |
| > | opCmp |
| >= | opCmp |
比較演算は a.opCmp(b) か b.opCmp(a)のどちらかに展開されます。
opCmp関数はint値を返す関数として定義する必要があります。
a.opCmp(b)のとき,a < bなら-1を,a==bなら0を,a > bなら1を返すようにしてください。
opCmpが定義されていればopEqualsは定義されていなくてもopCmpを使うことで等値演算を実装できます。
しかしながら,等値演算は比較演算と比べて処理が軽いケースが多いです。
処理負荷の最適化を考えるならば,等値演算もオーバーロードしたほうがいいでしょう。
| 記号 | 関数名 |
| = | opAssign |
| += | opAddAssign |
| -= | opSubAssign |
| *~ | opMulAssign |
| /= | opDivAssign |
| %= | opModAssign |
| &= | opAndAssign |
| |= | opOrAssign |
| ^= | opXorAssign |
| <<= | opShlAssign |
| >>= | opShrAssign |
| >>>= | opUShrAssign |
代入演算子が使用されるとa.opfunc(b)というコードに展開されます。
代入演算子の関数は次のように実装してください。
1
2
3
4
5
6
7
| - | | | | ! | |
スクリプト上で宣言されたクラスは自動でコピー演算子(opAssign)が実装されます。
自動で生成される挙動とは異なる挙動を実装したいときにopAssignをオーバーロードしてください。
| 記号 | 関数名 | 関数名(反転) |
| + | opAdd | opAdd_r |
| - | opSub | opSub_r |
| * | opMul | opMul_r |
| / | opDiv | opDiv_r |
| % | opMod | opMod_r |
| & | opAnd | opAnd_r |
| | | opOr | opOr_r |
| ^ | opXor | opXor_r |
| << | opShl | opShl_r |
| >> | opShr | opShr_r |
| >>> | opUShr | opUShr_r |
『a 演算記号 b』と記述されると a.opfunc(b) か b.opfunc_r(a) に展開されます。
ASではC#やD言語のようにプロパティアクセサを実装することができます。
クラスのメンバとして実装することはもちろん,グローバル変数としても実装することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | - | - | | ! | | - | | | | | | ! | | | ! - | | | | | | | | | ! | |