Giraffe+ 0.5.61.772
前リリースからの変化
- Object.toss, toss_exを定義
- WM_SETTINGCHANGEで強制終了することがあったのを修正
- ShowMenu内のブロックのコンテキストを呼び手と同じにした
- ShowMenuに無効アイテムをサポートさせた
- キーコードと文字列の変換を整理した
- Keyboard.dllを廃止した
- Contaienr.-, -=を定義
- Container.<<をpush_backのシノニムとして定義
- Array.shallow_copy, shallow_assign, deep_copy, deep_assign, inner_copyを定義
- Block.assert, checkを改善した
- 数値リテラルの後置型指定を整理した
- シングルスレッド描画からマルチスレッド化できるようにした
- C/C++の関数のスクリプトメソッド化を整理した
- 文字列リテラルが閉じてない場合のエラーメッセージがおかしかったのを修正
- Astringオブジェクトを定義
- 設定ダイアログのDescription部分もリロードされるようにした
Object.toss, toss_exを定義
Method.invokeの逆です。メソッドを引数に取り、それにselfを渡して実行します。toss_exはselfを展開(expand)します。Method.invokeと違い実行順が見た目どおり左から右になることに意義があります。
{1 2 3}.toss& `*[arg.size] //1 {1 2 3}.toss_ex& `*[arg.size] //3
WM_SETTINGCHANGEで強制終了することがあったのを修正
LPARAMがNULLにならないと思い込んでました。
ShowMenu内のブロックのコンテキストを呼び手と同じにした
なってませんでした。というか、意識してませんでした。
ShowMenuに無効アイテムをサポートさせた
!で始まるキャプションはグレー化されます。先頭の!を取り除いたものと同じように扱われます。
ShowMenu(0 0 'item&1' ['item1'] '' '!+&sub' 'sub&1' ['sub1'] 'sub&2' ['sub2'] '-' '!item&2' ['item2'])
ShowMenuの仕様については結構複雑化してきたので一度まとめて解説します。
キーコードと文字列の変換を整理した
セミコロンの変換がおかしくなってたので、それを直すついでに、根本的に整理して効率化とキー名の追加をしました。
今までのキー名に加え、WinUser.hのVK_*を全て定義し、doc/keymaps.txtに一覧を保存しました。Script/output_keymaps.giraffeによる自動生成です。
キー名の追加や変更も可能にしようと思ってましたが、それをすると設定が全体的に崩壊するのでやめました。
Script/key_dout_mode.giraffeを実行すると入力されたキーをデバッグ出力するようになります。もう一度実行するとモードを終了します。
Keyboard.dllを廃止した
Giraffe.exeで互換性のあるKeyboardオブジェクトを定義しました。そして、DLL名が定義済みの場合はDLLディレクトリのDLLを自動ロードしない仕様にしました。
キー名がKeyboard.dllとGiraffe.exeで不一致になるのを回避するためですが、ついでにStrToKey等のキー名変換メソッドを定義しておきました。使い方等はScript/Keyboard$test.giraffeを参照してください。
Contaienr.-, -=を定義
selfと引数との差分を返します。eachしてremoveするのと同じですが、こちらのほうが効率がいいです。
"abcdef".- "bcdf" //"ae"
Conatiner.removeが勝手にeraseを呼ぶ仕様はやっぱりよくないのかなと、これを実装してるときに思いました。Container.remove_sortとでもしてeraseしない版を定義しておくのもいいかと思いましたが、別にいいかとやってません。
Container.<<をpush_backのシノニムとして定義
selfを返しますから、ストリームみたいに出来ます。
Array.shallow_copy, shallow_assign, deep_copy, deep_assign, inner_copyを定義
配列のコピーはやっぱりシャローコピーにしたほうがいいんじゃないかと思ったんですが、速度を求める部分以外は手軽なほうがいいと判断して、明示的に呼べるようにしておきました。
inner_copyは、要素をコピーして、それを要素と入れ替えます。ようするに、shallow_*してinner_copyするとdeep_*したのと同じ結果になります。
Array.=はdeep_assign, Array.copyはdeep_copyと同じ結果になります。
Block.assert, checkを改善した
引数を取って、それとselfのeval結果を比較し、違えば両方の値を表示して想定とどう違うのかを解かりやすくしました。
引数が無い場合はデフォルト引数がtrueであるかのように振舞うので、今までのコードは同じように機能します。
数値リテラルの後置型指定を整理した
旧言語の括弧を使った型指定と、C/C++と同じ数値にそのまま型指定子を繋げて書く方式を統合しました。
両方の書式で両方の型名が使えます。今まで無かったWchar, Character(Wcharと同じ), fもサポートしました。比較方法等も変えたので高速化もしました。
例: 以下は全て255のFloatになります。
255f 255float 0xff(f) 0xff(float)
シングルスレッド描画からマルチスレッド化できるようにした
シングルスレッド描画設定時(Settings/setup/SingleThreadDrawing)に、待ち時間(Config/Draw.*.*.Thread.Enable - 1 ミリ秒)が設定されてると、待ち時間経過後に並列処理になるようにしました。
ややこしい仕様なんですが、シングルスレッド描画において、待ち時間は全くの無意味なので、そういうふうにしてみました。
マルチスレッド描画で待ち時間を設定してると、メインスレッドに待ちが発生し操作感が悪くなりますが、待ち時間無しでは一気に10から20のスレッドが生成され実行効率が悪いです。
シングルスレッド描画なら両方の問題はありませんが、ネットワークパス等で処理が滞った場合に他の描画も停止してしまいます。
そこで、両方を組み合わせてみました。大抵の場合に無駄にスレッドを生成することになりますが、アイコン取得のIOが結局遅いので、そのコストを体感することはありません。
C/C++の関数のスクリプトメソッド化を整理した
ソースが綺麗になっただけで実行効率等にはほとんど変化はありません。
selfを返すべきところで無駄にオブジェクトを生成して、selfの参照のようなものを返してた部分がなくなりました。
デフォルト引数をサポートするメソッドを定義する際の無駄なメソッドオブジェクト生成がなくなりました。
文字列リテラルが閉じてない場合のエラーメッセージがおかしかったのを修正
開かれた限りは閉じなければいけないという定義になってませんでした。(ダブル)クオートはシンボルに含まれない文字なのでエラーにはなってましたが。
Astringオブジェクトを定義
std::stringを使う関数にStringを渡せるようにするためです。
as_Stringを持ち、Stringの子なので、Stringのconstメソッドが利用できますし、Stringがas_Astringを持つので、スクリプト側から意識することの無いオブジェクトです。
設定ダイアログのDescription部分もリロードされるようにした
スクリプトのリロード時です。何か意図があってそうならないようにしてた気がするので、ひょっとしたら何か問題があるかもしれません。無いと思ったからやったんですが。