Giraffe+ 0.5.21.353

Downloadページへ

前リリースからの変化

  • std::copyをContainer.copy_intoとして定義
  • Istream.getをObject.getのオーバーロードとして再定義
  • Istream_iterator, Istream_line_iterator, Ostream_iteratorを定義
  • Istream.begin, endをIstream_iteratorを返すメソッドとして定義
  • Istream.lbegin, lendをIstream_line_iteratorを返すメソッドとして定義
  • Ostream.obeginをOstream_iteratorを返すメソッドとして定義
  • Back_insert_iterator, Front_insert_iterator, Insert_iteratorを定義
  • Container.obeginを引数無しの場合はBack_insert_iterator、有りの場合はInsert_iteratorを返すメソッドとして定義
  • IosをContainerの子とした
  • Container.lrangeをself.lbeginとself.lendによるレンジを返すメソッドとして定義
  • 暗黙の型変換の仕様をまた少し変えて、ポインタからポインタの変換時にポインティの継承関係を扱えるようにした
  • パース時に__LINE__と__COLUMN__をそれぞれファイルの行と列に置き換えるようにした
  • 内部の式クラスにそれが定義されたファイル名と行と列を保持するようにした
  • Object.scopeを引数の関数にselfを渡して実行後にself.closeするメソッドとして定義
  • Block.checkをself.evalの戻り値がfalseの場合にself.to_String.flush(Dout)するメソッドとして定義
  • Block.assertをself.evalの戻り値がfalseの場合にself.to_Stringを表示する例外を投げるメソッドとして定義
  • スクリプト実行のエラーダイアログを、エラーのあったスクリプトを開けるものにした

std::copyをContainer.copy_intoとして定義

いろいろイテレータが使えるようになってきたので。

Istream.getをObject.getのオーバーロードとして再定義

オーバーロードできるの忘れてました。

Istream_iterator, Istream_line_iterator, Ostream_iteratorを定義

Istream_iterator、Ostream_iteratorともに扱うのは文字です。std::(i|o)stream_iteratorです。Istream_line_iteratorはhamigakiのものを使っています。

Istream.begin, endをIstream_iteratorを返すメソッドとして定義

これでIfstream.eachでファイルを一文字ずつeachできるようになりました。

Istream.lbegin, lendをIstream_line_iteratorを返すメソッドとして定義

これでIfstream.lrange.eachでファイルを一行ずつeachできるようになりました。

Ostream.obeginをOstream_iteratorを返すメソッドとして定義

あんまり使い道は無いんですが、Istream_iteratorを定義したので。

Back_insert_iterator, Front_insert_iterator, Insert_iteratorを定義

それぞれ、push_back, push_front, insertをcallするものです。

Container.obeginを引数無しの場合はBack_insert_iterator、有りの場合はInsert_iteratorを返すメソッドとして定義

std::copyはこれらが無いと使い物にならないので。

IosをContainerの子とした

これにより全てのStreamがeachやlrangeを得ます。

Container.lrangeをself.lbeginとself.lendによるレンジを返すメソッドとして定義

self.lbegin...(self.lend)と全く同じです。

暗黙の型変換の仕様をまた少し変えて、ポインタからポインタの変換時にポインティの継承関係を扱えるようにした

これまでの仕様だと、Cout.rdbuf(Stringstream.rdbuf)みたいなのが出来ませんでした。

パース時に__LINE__と__COLUMN__をそれぞれファイルの行と列に置き換えるようにした

__FILE__と同じです。型はUint(size_t)です。exprが保持するようになったので、別にパース時に置き換える必要は無いんですが、まあ、そういうものなので。

内部の式クラスにそれが定義されたファイル名と行と列を保持するようにした

スクリプトから参照する手段は今のところありません。exprのラッパーであるBlockオブジェクトからアクセスできるようにしてもいいのですが、exprの仕様がもっと固まってからです。
これの実装のためにBoost.Spiritに用意されてるposition_iteratorを少しいじったものを使いました。それに伴い、ノード生成ポリシーをnode_val_dataからnode_iter_dataに変更した結果、パーサが倍速ぐらいになりました。起動時やイベントメニューなど、いろんな部分でボトルネックとなる部分だったので、ずっと高速化したかったわけですが、ノード生成に関しては全く意識してませんでした。

Object.scopeを引数の関数にselfを渡して実行後にself.closeするメソッドとして定義

これで、

Ifstream.new(filepath).scope& `f[
  f.lrange.each& `line[
    //行ごとの処理
  ]
]

とできるようになりました。self.closeはRAIIで呼ばれるので、スコープ内で例外等が飛んでも実行されます。

Block.checkをself.evalの戻り値がfalseの場合にself.to_String.flush(Dout)するメソッドとして定義

exprにファイル位置が保持されるようになったので、使い物になるかと。

Block.assertをself.evalの戻り値がfalseの場合にself.to_Stringを表示する例外を投げるメソッドとして定義

Block.checkとの違いは、処理を続けるかどうかです。

スクリプト実行のエラーダイアログを、エラーのあったスクリプトを開けるものにした

メッセージ表示部をリストボックスにして行選択できるようにしました。リストボックスにフォーカスがある状態でEnter、もしくはリストボックスをダブルクリックすることでVirtual.EditScript(file line column)が実行されます。
設定ダイアログのsetupにUseXyzzyAsScriptEditorを置いておきましたので、参考にしてください。設定ダイアログのEdit This ScriptもVirtual.EditScriptに依存するようにしておきました。