思い残すことを列挙すると,
・クラスのバインドが出来てない
・Squirrel 側から出た例外を C++ 側でキャッチ出来てない
・SqPlus のような自動バインド機能を使えていない
・Eclipse が単なる Squirrel コードエディタだったので IDE として使いたかった
(※Squirrel プロジェクトを作るみたいなのがあったのできっと出来るハズ)
しかしチャレンジで得たことも多かった.列挙すると,
・Squirrel 2.2.2 をほとんど使いこなせるようになった
(※スタックの動きは完璧に近い理解をしているであろう)
・lua や Squirrel の「テーブル」の概念を覚えた
(※こいつぁ便利度高過ぎる)
・コルーチンを実用出来た
(※やっぱり便利 最終的にシーン管理なんかはほとんどこいつで自動化された)
・Squirrel ではグローバル変数を多大に使うことになるが案外どうにかなると知った
・この程度の規模なら Squirrel でメインループから書いてしまっても問題なかった
(※と言ってもメモリ 512MB などの環境では他のソフトとの同時起動なんかは厳しかったようだけど)
さて,SqPlus をどうすっぺか.個人的に今の「関数と定数のバインドだけ出来る」状態で十分っぽいのよね.
後現状で分かっている問題…というか仕様上どうしようもない問題っぽいのが 1 つあって,それがコルーチンでの this がルートテーブル一択であること.例えば以下のようなコードを考える.
::y <- 0;
class Cls {
x = null;
constructor() {
x = 0;
}
function method() {
//local cr = this.newthread(this.f); //こう書いても変わらない
local cr = ::newthread(this.f);
cr.call();
while (cr.getstatus() == "suspended") {
print("while loop\n");
cr.wakeup();
}
}
//コルーチン本体
function f() {
if ("y" in this) print("y exist\n");
if ("x" in this) print("x exist (success!)\n");
for (local i = 0; i < 5; i++) {
print("coro loop " + i + "\n");
::suspend();
}
return null;
}
}
local c = Cls();
c.method();
とすると実行結果は
y exist
coro loop 0
while loop
coro loop 1
while loop
coro loop 2
while loop
coro loop 3
while loop
coro loop 4
while loop
となる.this には x は存在せずに y が存在している.これは this がルートテーブルであることの証拠である.(わざわざループを書いたのはコルーチンをそれっぽく見せるためw)
せいぜいこれを解決するには
::y <- 0;
class Cls {
x = null;
constructor() {
x = 0;
}
function method() {
//local cr = this.newthread(this.f); //こう書いても変わらない
local cr = ::newthread(this.f);
cr.call(this); //自分自身のインスタンスを渡す
while (cr.getstatus() == "suspended") {
print("while loop\n");
cr.wakeup();
}
}
//コルーチン本体
function f(inst) {
this = inst; //強制的に this を書き換える
if ("y" in this) print("y exist\n");
if ("x" in this) print("x exist (success!)\n");
for (local i = 0; i < 10; i++) {
print("coro loop " + i + "\n");
::suspend();
}
return null;
}
}
local c = Cls();
c.method();
のようにする程度しか思い付かない.
this を強制的に書き換えるってのが非常に気持ち悪い感じ… Squirrel ならこれくらい普通!と思い込むことも可能ですが,はてさて (^^;
[追記 2009-11-30T06:59]
解決しました.詳細は
こちらのエントリから.
サモ (2009-07-07T17:41:58)
ちゅーか65とかチートだろwwwwwwwwwwwwwwwwwwwwwww
か (2009-07-07T22:09:18)
現時点で「3 桁は可能!」という結論らしい.
しかし 3 桁になると多分プログラムがバグって落ちるw