Giraffe+ 0.5.51.663

Downloadページへ

前リリースからの変化

  • Boehm GCを7.1にした
  • Giraffe.ListBox.SetItemTextを定義
  • settings/key/AddFileData2, setup/AddRegItemWithDnDを追加
  • Giraffe.SerializeWindowsを定義
  • ほとんどのオブジェクトにto_*SELF*とas_*SELF*を定義
  • Object.to_Containerを定義
  • Object.parent?, identical_or_parent?を定義
  • パターンマッチング時の簡易型指定の判定をObject.identical_or_parent?でするようにした

Boehm GCを7.1にした

ついでに使い方をより変更点の少ないものにしました。gc.dllにGC_init_parallelとGC_need_to_lockをexportさせてるだけです。

Giraffe.ListBox.SetItemTextを定義

SetItemText(index text)はリストアイテムのテキスト値のみを変更します。マーク等は保持されます。SetItem(index text)は引数のテキストを持つリストアイテムを新規作成します。他の値はデフォルトになります。SetText(index text)は表示用テキストを設定します。

settings/key/AddFileData2, setup/AddRegItemWithDnDを追加

登録アイテム追加にまつわる、キャッシュ更新、複数追加、Unicode等、いろいろあった懸案事項がやっと解決しました。
以下仕様箇条書き:

  • モードによる実装
  • key/enterもしくは同モードの再実行によりOK
  • テキスト空時key/escでキャンセル
  • エディットの内容を変更すると選択中のリストアイテムが変化
  • 上書き確認にキャンセルすると、処理は中断、モードは続行
  • モード終了後はモード突入前の状態に戻る

登録アイテムの編集も、登録アイテム名がエディットにある状態でこれを実行して、編集後上書き保存することで可能です。

Giraffe.SerializeWindowsを定義

ウインドウの状態の文字列化です。引数無しで呼ぶと文字列を返し、その文字列を引数にして呼ぶとその文字列が生成されたときの状態にGiraffe+のウインドウが戻ります。対象となる状態はウインドウの位置と文字列やマーク等の内部データです。

ほとんどのオブジェクトにto_*SELF*とas_*SELF*を定義

一部のオブジェクトに利便性のために定義していたのを、全体的な仕様としました。*SELF*はオブジェクト名です。どちらもselfを返すだけです。

Object.to_Containerを定義

selfを第一要素とする配列を返します。これにより、

f: `x[
  x.to_Container.each& `y[
    //operation for a single object.
  ]
]

f(0)
f({1 2})
f(3...5)

というような、Containerならその要素を、そうでないならその要素のように、同じように処理するというのが可能、になる予定でしたが、StringがContainerですので、これだと、

f('abc')

とした場合に、文字a, b, cがそれぞれ処理されることになり、期待してない動作になります。StringをContainerと見做すべきか、というのが根本的な問題だと思います。

Object.parent?, identical_or_parent?を定義

parent?は引数のオブジェクトを親に含む場合にtrueを返します。似たようなメソッド、type?はオブジェクトではなく、オブジェクト名を取り、@nameを、親のものも含め、調べます。identical_or_parent?はそのまま、

identical?(x).|| [parent?(x)]

と同じです。

パターンマッチング時の簡易型指定の判定をObject.identical_or_parent?でするようにした

今まではinstance_typeが同じかどうかを見てました。これにより、より抽象的な親を使えるようになりました。
Containerの平坦化サンプル:

`x(Container)[
  a: {}
  x.each& `y[
    a.+= (parent.recur(y))
  ]
  a
].| `x[
  {x}
].invoke({0 {1 2} {3 {"456" 7}}}).join('/') //"0/1/2/3/4/5/6/7"