スクエニがWiiウェアを作るのに組み込んだということで話題になった(?)プログラム言語 Squirrelをちょっとだけ使ってみたのでメモ。
公式とWiki。
C++用のバインダなら SqPlus が便利らしい(他のは試してないけど(ぇ))。g++用の Makefile と、VC++用のファイルも入ってて、ちょっと試すのも楽ちん。せっかくなので VC++で試した。特に詰まる事も無く、あっさりビルドできた。
Squirrel から C++ のメソッドを呼ぶサンプルは、minimalSqPlus。C/C++ から Squirrel の関数を呼ぶサンプルは、etc/minimal.c。両方ともわかりやすい。
Makefile がシンプルなのが嬉しい。configureとか無い。gcc 以外でコンパイルする時は、Make を新たに書くのが楽ってことなんだよな。たぶん。
あとでやる?
C/C++ から Squirrel を呼ぶ関数を、もうちょっと簡単に定義したい。マクロでなんとかできそう。すでにありそうな気もする。
Squirrel用のメモリ確保の再定義をどこでやってるのか調べる。
Squirrelで書いたハンドラっぽいクラスを C++から呼んでみたが、いまいちスマートじゃない気がするのであとで考えるかも。
class XHandler{ function onEnter() {print("XHandler::onEnter");} } class XXHandler{ function onEnter() {print("XXHandler::onEnter");} } // Cから呼ばれるハンドラ設定 function GetXHandler() { return XHandler; //return XXHandler; }
C側
void call_handler_on_enter(HSQUIRRELVM v) { SQInteger top = sq_gettop(v); // ハンドラ取得を探す sq_pushroottable(v); sq_pushstring(v,_SC("GetXHandler"),-1); if(!SQ_SUCCEEDED(sq_get(v,-2))) { goto FAILED; } // ハンドラ取得を呼ぶ sq_pushroottable(v); if (!SQ_SUCCEEDED(sq_call(v,1,SQTrue,SQTrue))) { goto FAILED; } // 戻り値取得 SQInteger handler = sq_gettop(v); // onEnterを探す sq_push(v, handler); sq_pushstring(v,_SC("onEnter"),-1); if(!SQ_SUCCEEDED(sq_get(v,-2))) { goto FAILED; } // onEnter を呼ぶ sq_pushroottable(v); if (!SQ_SUCCEEDED(sq_call(v,1,SQFalse,SQTrue))) { goto FAILED; } goto SUCCESS; FAILED: printf("FAILED\n"); SUCCESS: sq_settop(v,top); //restores the original stack size }
こんな事するよりは、Squirrel側のクラス名を決めといたほうがいいんだろうな‥‥。めんどくさいし。命名規則がめちゃくちゃなのは気にしないで><