''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 ); } }; }} |