ゆろさんへの回答
返事が遅れて申し訳ありません。
Allegroとの格闘が長引いてしまいました。
0.9.5.3と、今回の0.9.7.0は、C++側の使い方が結構変わってしまいました。これも申し訳ありません。
今現在、マルチバイト文字をベースにしていますが、defineオプションでもいいので
unicodeに対応してほしい。
UTF-8なら、とりあえずは使える感じになっています。xtal::initialize(); の前に、set_code_utf8(); を呼び出します。
ソースのコンパイル、String::splitなどはちゃんとUTF-8として扱います。
文字コードの混在は今のところ出来ません。*1
UTF-16, UTF-32は、今後defineで切り替えられる方向で対応したいと思います。
事前コンパイルを行ったバイトコードの取り扱いが中途半端
compile -> object_dumpでバイトコードを作成できますが、例えばlib().memberで
登録時などにはバイトコードが使えないように見えます。
これはどうするか悩ましいのですが、とりあえず、lib()->member("hoge") が呼ばれる前に、lib()->def("hoge", fs.deserialize); と自分で定義してあげることで回避できます。
(object_dump、object_loadは、Stream::serialize、Stream::deserializeに変更されました)
入出力のカスタマイズが中途半端
object_dumpなどは、Streamクラスを継承して入出力のカスタマイズが可能ですが、
例えば先ほどのlib().memberなどは直接fopenを呼んでいます。
ゲームなどでは、リソースデータを1つのアーカイブファイルにまとめて、
独自の入出力関数でアクセスしたい、ということが多々あるかと思います。
はい、ファイルオープンなどは、今後カスタマイズ可能にしたいと思います。
実行環境(VM, libなど)を複数作成したい & 切り替えたい & 複製したい
現在のXtalでは実行環境がスレッド毎に1つしかないようですが、
複数サポートは難しいでしょうか?
VMachineは既に複数サポートされています。
libを複数持つというのは、ちょっと難しいですね。
例えば、ステージ管理用、プレイヤーキャラ管理用、敵キャラ管理用etcなスクリプ
トをfibre & yieldでメインプログラム(C++)側に戻りながら切り替えたいとします。
これが現在できないように見えます。
これは出来ます。fiberは、VMachineを内包して動作しています。
// test.xtal export fiber{ yield 5; yield 6; yield 7; } // test2.xtal export fiber{ yield 1; yield 2; yield 3; } FiberPtr f1 = ptr_cast<Fiber>(load("test.xtal")); FiberPtr f2 = ptr_cast<Fiber>(load("test2.xtal")); f1()->p(); f2()->p(); f1()->p(); f2()->p(); f1()->p(); f2()->p();
このように、交互に実行出来ます。
また、xtalスクリプト側に公開する関数も用途別に異なり、スクリプト実行の速度の
点からも関係ない関数は関係ない用途のスクリプトの実行環境に登録したくない
などもできない気がします。
libにいくら追加しても、実行速度には影響しませんので、その点は大丈夫かと思います。
*1:convert機構などを持つと、サイズがドーンとでかくなるので