''AngelScript''
LuaとかSquirrelは動的型スクリプト言語。
静的なものがないかと探していたらangelscriptを見つけた。
ちょっといじってみよう。
#contents

* リンク [#sb7bd538]
http://www.angelcode.com/angelscript/
http://angelscript.pbwiki.com/
http://liw.rulez.jp/index.php?%A5%D7%A5%ED%A5%B0%A5%E9%A5%E0%2FAngelScript

* スクリプト実行の順序 [#t99be81c]
+ エンジン作成
+ コールバック登録(エラー,例外時に活躍?)
+ スクリプトファイルをエンジンに登録
+ ビルド(コンパイル) ← さすが静的型。
+ 実行
+ 後片付け

includeは自前で実装しているのね。


* 構文 [#l789f3fc]
** class [#zbe0b959]
- public,protected,privateは無し。
- 継承もなし。
- コンストラクタ,デストラクタは有り。
- operatorは可能?(未確認)

** import [#tf87bcd5]
他のmoduleの''関数''(Typeは不可)を自分のmodule内で使うための機能。

なので,一工夫したほうがいいかも。
その一例。
実装クラス(L_MathVector3)はIObjectを必ず継承する。
外部に公開する関数(F_MathVector3_*)はクラス外に宣言し,引数の先頭に必ずIObjectをとる。
他のモジュールは,公開されたその関数を通してアクセスするか,そのラッパークラス(MathVector3)を使ってアクセスする。

:C++コード|
#code(c,){{
// IObject型を追加。
engine->RegisterInterface("IObject");
}}

:Vector3_Local.as|
こいつは,mathモジュールでのみコンパイルされる。
クラスの内部実装を記述している。
#code(c,){{
// module math - local
class L_MathVector3 : IObject
{
  L_MathVector3(){ /* */ }
  float mX;
  float mY;
  float mZ;

  float& x()
  {
    return mX;
  }

  void normalize()
  {
    //...
  }
};
IObject@ F_MathVector3_Constructor()
{
  MathVector3 obj;
  return @obj;
}

float& F_MathVector3_x( const IObject@ in obj )
{
  return cast<L_Vector3>(obj).mX;
}
void F_MathVector3_normalize( IObject@ obj )
{
  cast<L_Vector3>(obj).normalize();
}

}}

:Vector3.as|
こいつは,他のmoduleでコンパイルされる。
クラスの内部実装は書かず,内部実装が書かれている関数を呼ぶだけに留める。
#code(c,){{
// module public
import IObject@ F_MathVector3_Constructor() from "math";
import float& F_MathVector3_x( const IObject& in ) from "math";
import void F_MathVector3_normalize( const IObject& in ) from "math";
class MathVector3
{
  MathVector3()
  {
    mObj = F_MathVector3_Constructor();
  }
  IObject@ mObj;

  float& x()
  {
    return F_MathVector3_x( mObj );
  }

  void normalize()
  {
    F_MathVector3_normalize( mObj );
  }
};
}}

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