Ads by Google

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

じゃがりこはお湯を注いでから食べる。

Harmist の設計思想/開発方針として「(可能な限り) モジュール単位で実装を外部に切り離し、それら一つ一つのソースをオープンにすることでバグトラッキングの効率を上げ、全体の信頼性を高めていく」というものが。

Harmist のインターフェイスを満たしさえすればスクリプトエンジンは Squirrel 以外でもOK (既にきららさんが Hornet 時代に作った Ruby 実装がある)。


Harmist のインターフェイスでは、

o ScriptClass を生成
o ScriptEngine に、先ほど生成した ScriptClass のインスタンスを登録
o ScriptEngine::DefineMethod() などでメソッドを登録していく

といった流れでクラスを登録する (実際はマクロが処理を肩代わりするため、直接 DefineMethod() などを呼ぶことは殆ど無い)。

Squirrel は Lua 同様 API がスタックベースなので、

…って、なんだか書きながら解決策が見えてきた気がする。あーまだ見えないかも。

                                        続きは WEB で!
sq_getstackobject() で解決しそうな予感。
というか、たぶんコレでいけるな...。

 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 の日本語マニュアルに載ってた。翻訳者の松本さんに多謝。
(ちゃんとドキュメントを読んだつもりでも案外見落としてるもんですな)
強参照を扱えるようになれば、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 を使うといいよ!
(あ、アレ…投稿したはずのコメントが表示されない (=゜ω゜) !?













管理人にのみ表示を許可する


ホーム


最近は Reason で作曲をしたり、
noughts で絵を描いたりもする。

現在 17 歳。普通科高校 3 年生。
C/C++, Lua, Squirrel, GLSL
を喋るヒトっぽい。

Categories

Archives

Comments