構文 - Script Language Edit

Last-modified: 2010-03-24 (水) 22:24:36

このページについて Edit

AngelScript(AS)のスクリプト構文について書きます。
(このページに書かれているサンプルコードの一部はAngelScript公式のドキュメントから転載しています。)

「同等」と「同様」について Edit

文中で「C++と同等」と「C++と同様」という言葉を使っています。
「C++と同等」は「C++とほぼ同じ」という意味合いで,
「C++と同様」は「C++と全く同じ」という意味合いで使っています。

字句 Edit

コメント Edit

C++と同様に1行コメント,ブロックコメントの2種類が使えます。

すべてを展開すべてを収束
  1
  2
  3
  4
 
 
 
 
// 1行コメント
/*
 ブロックコメント
*/

Edit

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
// 10進数表現した整数値
int a = 3; 
 
// 16進数表現した整数値
int b = 0xFFFF;
 
// 64bit浮動小数
double ca = 1.2345;
double cb = 1.2345e10;
 
// 32bit浮動小数
float da = 1.2345f;
float db = 1.2345e10f;
 
// bool値
bool ea = true;
bool eb = false;

Edit

組み込み型 Edit

C++と同等の組み込み型が用意されています。

void
C++と同様に関数の戻り値に型に使います。
bool
C++と同様のもので,true,falseのどちらかの値を持ちます。
整数
下記のタイプが存在します。
型名最小値最大値
int8-128127
int16-3276832767
int
int32
-21474836482147483674
int64-922337720368547758089223372036854775807
uint80255
uint16065535
uint
uint32
04294967295
uint64018446744073709551615
公式のドキュメントによると,パフォーマンスを最適化したいのであれば
32bitより小さい型の値はクラスのメンバ変数など,データを保持するもののみに使用し,
それ以外(ローカル変数,一時変数など)は32bitの型の値を使用したほうがいいようです。
小数
下記のタイプが存在します。
型名値の範囲一番小さい正の値最大桁数
float+/- 3.402823466e+381.175494351e-386
double+/- 1.7976931348623158e+3082.2250738585072014e-30815
公式のドキュメントによりますと,ASではNaN(Not-aNumber)を0x7fc00000で表現しているようです。

配列 Edit

配列の変数は次のように宣言します。

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
// int型の配列を宣言
int[] intArray;
 
// int型の配列を3つ宣言
int[] intArrA,intArrB,intArrC;
 
// 何も初期化子を指定しなければ,長さ0の配列を作ります
int[] a; // a.length() == 0
 
// 初期化子に数を指定すると,その数の長さの配列を作ります
int[] b(3); // b.length() == 3
 
// 配列初期化子を指定すると,それがコピーされた配列を作ります。
int[] c = {1,2,3}; // 先頭から1,2,3がコピーされた配列

配列はC++と同様にインデクス式を使ってアクセスします。
また,配列の長さはlength()メソッドにより取得できます。

すべてを展開すべてを収束
  1
  2
  3
  4
  5
 
 
-
|
!
int[] a = {0,1,2};
for ( uint i = 0; i < a.length(); ++i )
{
    a[i] += 1;
}

ユーザー定義型 Edit

ユーザー定義型(クラスや列挙型)はC++と同様に宣言することができます。

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
 
 
 
 
 
 
// objという型のインスタンスが作られる
// デフォルトコンストラクタがあればそれが呼ばれる
obj a;
 
// objの一時変数を作成し,aに代入する
a = obj();

オブジェクトハンドル Edit

オブジェクトハンドルとはC++でいう参照・ポインタにあたるものです。
参照先のオブジェクトは参照カウンタで寿命を管理しているため,「既に破棄されたデータにアクセスする」という不正なデータアクセスはおこりません。
もしnullなオブジェクトハンドルにアクセスしようとしたら例外が発生しスクリプトの実行が止まります。

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 
 
 
 
 
 
 
-
|
!
 
obj o;
obj@ a; // a はnullで初期化されます
obj@ b = @o; // oの参照をbに代入します
 
b.ModifyMe(); // o.ModifyMe()と同様のことがおこります
 
if ( a is null ) // nullかどうかチェックしています。
{
  @a = @b; // aにbが参照しているオブジェクトを代入します。この場合,結果的にoの参照が渡されています。
}

文字列 Edit

ASでの文字列は8bitもしくは16bitのデータの配列として扱われます。

ASではC++と同等のエスケープシーケンス文字が用意されています。
下記がエスケープシーケンス文字をまとめた表です。

文字意味
¥00null文字
¥¥92バックスラッシュ
¥'39シングルコーテーション
¥"34ダブルコーテーション
¥n10改行文字 LF
¥r13改行文字 CR
¥t9TAB
¥xFFFF0xFFFF16bitで表した文字
¥uFFFF0xFFFFunicode16bitで表した文字
¥uFFFFFFFF¥0xFFFFFFFFunicode32bitで表した文字

文字列はダブルコーテーションもしくはシングルコーテーションで囲んで表します。

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
 
 
 
 
 
 
 
 
// ダブルコーテーションで囲む例
// 文字列の中にダブルコーテーションを使いたいときは,エスケープ文字を使うこと。
string str1 = "This is a string with \"escape sequences\".";
 
// シングルコーテーションで囲む例
// シングルコーテーションで囲むと,エスケープ文字を使わずに文中にダブルコーテーションを使うことができる
string str2 = 'If single quotes are used then double quotes can be included without "escape sequences".';

C++と同様に複数の文字列を1つの文字列として連結することができます。

すべてを展開すべてを収束
  1
  2
  3
 
 
 
// strには "First Line.¥nSecondLine.¥n"が代入される
string str = "First Line.¥n"
  "Second Line.¥n";

ASでは"""を使うことで複数行に渡す文字列を簡単に記述することができます。

すべてを展開すべてを収束
  1
  2
  3
  4
  5
 
 
 
 
 
// """ で始まった文字列は """で閉じる
string str = """
First Line.
Second Line.
""";

Edit

宣言文 Edit

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
// 同じ型の変数はカンマで区切ることで複数宣言することができます。
int var = 0, var2 = 10;
object@ handle, handle2;
 
// C++と同様にconstをつけることができます
const float pi = 3.141592f;
 
// 組み込み型の変数の初期化子を省略した場合,値は未初期化となり不定になります
int randaomVar;
 
// オブジェクトハンドルの場合,nullが代入されます
object@ nullHandle;
 
// ユーザー定義型の場合,デフォルトコンストラクタが呼ばれます
object defaultCtorCalled;

式文 Edit

C++同様の式文が使えます。詳しくは式の項をご覧ください。

すべてを展開すべてを収束
  1
  2
 
 
a = b; // 代入演算式
func(); // 関数呼び出し

if文 Edit

C++同等のif文が使えます。

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 
-
|
!
 
 
-
|
!
 
-
|
!
if( condition ) 
{
  // condition == trueのときに実行する処理
}
 
if( value < 10 ) 
{
  // valueが10未満のときに実行する処理
}
else
{
  // valueが10以上のときに実行する処理
}

ただし,C++と異なり,C#のように条件部はbool値である必要があります。

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 
 
 
-
!
 
 
 
-
!
 
// 条件部はbool値である必要があるため,次のコードはエラー
int notZeroValue = 1;
if ( notZeroValue ) // エラー:条件がbool値でない
{
}
 
// 次のように書くこと
if ( notZeroValue != 0 )
{
}

for文 Edit

C++と同等のfor文が使えます。
ただし,条件部はif文と同じようにbool値である必要があります。

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 
-
|
|
|
|
|
|
-
|
!
|
-
|
!
!
 
for ( int n = 0; n < 10; ++n )
{
    // 10回する処理を書く
    // ...
    
 
    // continueやbreakも書けます
    if ( n == 5 )
    {
        continue;
    }
    if ( n == 9 )
    {
        break;
    }
}

while文 Edit

C++と同等のwhile文が使えます。
ただし,条件部はif文と同じようにbool値である必要があります。

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 
 
-
|
|
|
|
-
|
!
|
-
|
!
!
int i = 0;
while( i < 10 )
{
    i++;
 
    // continueやbreakも書けます
    if ( i == 5 )
    {
        continue;
    }
    if ( i == 9 )
    {
        break;
    }
}

do-while文 Edit

C++と同等のdo-while文が使えます。
ただし,条件部はif文と同じようにbool値である必要があります。

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 
 
-
|
|
|
|
-
|
!
|
-
|
!
!
int i = 0;
do
{
    i++;
 
    // continueやbreakも書けます
    if ( i == 5 )
    {
        continue;
    }
    if ( i == 9 )
    {
        break;
    }
}while( i < 10 );

switch文 Edit

C++と同様のswitch文が使えます。

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 
-
|
|
|
|
|
|
|
|
|
|
|
!
  switch( value )
  {
  case 0:
    // value == 0のときにここに飛ぶ
    break;
 
  case 2:
  case constant_value:
    // value == 2 もしくは value == constant_valueのときにここに飛ぶ
    break;
 
  default:
    // 全ての条件に該当しない場合,ここに飛ぶ
  }

return文 Edit

C++と同様のreturn文が使えます。

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 
-
|
!
 
-
|
!
 
float valueOfPI()
{
    return 3.141592f; // 値を返す
}
void function()
{
    return; // 値を返さずに関数の処理を終了する
}

スコープブロック文 Edit

C++と同様のスコープブロック文が使えます。

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
-
|
|
|
-
|
|
|
|
!
|
|
!
 
  {
    int a; 
    float b;
 
    {
      float a; // aという同じ名前の変数を宣言したため,int aを隠してしまいます
 
      // float aの値をbに代入しています
      b = a;
    }
 
    // ここで再びint aにアクセスできるようになります
  }

Edit

代入式 Edit

C++と同様の代入式が使えます。

すべてを展開すべてを収束
  1
 
lvalue = rvalue;

代入演算式 Edit

C++と同等の代入式が使えます。
ASのシフト演算はC++のものと異なり,左シフト,符号無し右シフト,符号有り右シフトの3種類のシフトが使えます。

すべてを展開すべてを収束
  1
  2
 
 
lvalue += rvalue;
lvalue = value + rvalue;

使用可能な代入演算記号は下記の通りです。

+= -= *= /= = &= |= ^= <<= >>= >>>=

関数呼び出し Edit

C++と同様の関数呼び出しが使えます。

すべてを展開すべてを収束
  1
  2
  3
  4
 
 
 
 
func();
func(arg);
func(arg1, arg2);
lvalue = func();

型変換式 Edit

算術演算式 Edit

ビット演算式 Edit

論理演算式 Edit

等値式 Edit

比較式 Edit

インクリメンタル式・デクリメンタル式 Edit

インデックス式 Edit

条件式 Edit

メンバアクセス Edit

オブジェクトハンドルアクセス Edit

丸括弧 Edit

スコープ解決 Edit

オブジェクトハンドル Edit

使い方 Edit

オブジェクトの寿命 Edit

ポリフォリズム Edit

関数 Edit

変数 Edit

インターフェース Edit

import Edit

列挙型 Edit

typedef Edit

クラス Edit

使い方 Edit

演算式オーバーロード Edit

プロパティアクセサ Edit


    ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS