Ads by Google
新しい記事を書く事で広告が消せます。
じゃがりこはお湯を注いでから食べる。
Harmist の設計思想/開発方針として「(可能な限り) モジュール単位で実装を外部に切り離し、それら一つ一つのソースをオープンにすることでバグトラッキングの効率を上げ、全体の信頼性を高めていく」というものが。Harmist のインターフェイスを満たしさえすればスクリプトエンジンは Squirrel 以外でもOK (既にきららさんが Hornet 時代に作った Ruby 実装がある)。
Harmist のインターフェイスでは、
といった流れでクラスを登録する (実際はマクロが処理を肩代わりするため、直接 DefineMethod() などを呼ぶことは殆ど無い)。o ScriptClass を生成
o ScriptEngine に、先ほど生成した ScriptClass のインスタンスを登録
o ScriptEngine::DefineMethod() などでメソッドを登録していく
Squirrel は Lua 同様 API がスタックベースなので、
…って、なんだか書きながら解決策が見えてきた気がする。あーまだ見えないかも。
続きは WEB で!
強参照を扱えるようになれば、VM クラスから値を操作するメソッドを外部の値専用クラスに切り離すことが可能に。
{
// インスタンス name を取得、参照カウンタをインクリメント
SqInstance inst = VM.refInstance("name");
// inst のフィールド name に値 3.14f を代入
inst.setField("name", 3.14f);
} // inst のデストラクタから参照カウントがデクリメントされる (ように SqInstance を書く)
こんなんが出来る。あぁ、やっといいラッパが書けそうな気がしてきた。
RCSP (Reference Counted Smart Pointer) をサポートしている Squirrel だからこそ安心して型を切り離せるというか。GC しかない実装でも実現できるけど、やっぱり弱参照はいつ解放されるか予測できないのがちょっと...。
Lua では強参照の概念が無いので、上のような使い方が出来るラッパを書くにはかなり冗長な処理が必要になるけど、Squirrel では断然スマートに実装できるのです。世界中の皆、もっと Squirrel を使うといいよ!
{
// インスタンス name を取得、参照カウンタをインクリメント
SqInstance inst = VM.refInstance("name");
// inst のフィールド name に値 3.14f を代入
inst.setField("name", 3.14f);
} // inst のデストラクタから参照カウントがデクリメントされる (ように SqInstance を書く)
こんなんが出来る。あぁ、やっといいラッパが書けそうな気がしてきた。
RCSP (Reference Counted Smart Pointer) をサポートしている Squirrel だからこそ安心して型を切り離せるというか。GC しかない実装でも実現できるけど、やっぱり弱参照はいつ解放されるか予測できないのがちょっと...。
Lua では強参照の概念が無いので、上のような使い方が出来るラッパを書くにはかなり冗長な処理が必要になるけど、Squirrel では断然スマートに実装できるのです。世界中の皆、もっと Squirrel を使うといいよ!
(あ、アレ…投稿したはずのコメントが表示されない (=゜ω゜) !?

というか、たぶんコレでいけるな...。
HSQOBJECT obj;
sq_resetobject(v, &obj) // ハンドルを初期化
sq_geststackobject(v, -2, &obj); // 位置-2からオブジェクトハンドルを得る
sq_addref(v, &obj); // オブジェクトへの参照を追加
// do something...
sq_pushobject(v, &obj); // スタック上のオブジェクトをpush
sq_release(v, &obj); // オブジェクトを解放
ってなコードが Squirrel の日本語マニュアルに載ってた。翻訳者の松本さんに多謝。
(ちゃんとドキュメントを読んだつもりでも案外見落としてるもんですな)