Giraffe+ 0.5.63.791

Downloadページへ

前リリースからの変化

  • Settings/setup/hotkey/AddDataActiveWindow2
  • Settings/setup/hotkey/ActiveWindowMenu
  • SwitchWindowに複数ウインドウ指定とコンテキストメニューを実装した
  • キーワード引数をサポートした
  • ShowMenuで!で始まるアイテムをチェックするようにした
  • String.replaceとsearchをオーバーロードにした
  • Container.(each|collect)_(ref|copy)を定義した
  • Object.caseを定義
  • 括弧でコンマの演算子優先順位解決をできるようにした
  • Characterのデパースをある程度リテラル文字化した
  • Object.thisを定義
  • Method.obeginを定義
  • Object.diagnosticizeを定義
  • Object.literalizeを定義
  • Object.==を===のシノニムとして定義
  • Object.!=(x)をself.==(x).notとして定義
  • window:set-top-mostを定義

Settings/setup/hotkey/AddDataActiveWindow2

ずいぶん前に作った"登録アイテム追加の新版"による"アクティブウインドウのモジュールの登録アイテム追加"です。

Settings/setup/hotkey/ActiveWindowMenu

アクティブウインドウを対象にしたウインドウ操作のメニューを出します。SwitchWindow用に作ったメニューを単体で使うものですので、プロセス操作関連以外はあまり意味がありません。

SwitchWindowに複数ウインドウ指定とコンテキストメニューを実装した

複数ウインドウをマークで指定してEnterした場合に、その指定されたウインドウがすべて、順番にアクティブ化するようにしました。
ついでに、ずいぶん前に書いた"コンテキストメニューの追加"をデフォルトでやっておくことにしました。
ウインドウ操作だけでなく、プロセス操作もできるようにしましたが、taskkillを使ったもの以外はhttp://www.beyondlogic.org/solutions/processutil/processutil.htmが必要です。
Script/window-menu.giraffeがメニューの実装です。

キーワード引数をサポートした

デフォルト引数を複数扱う場合、後方の引数だけを指定することができません。

f: `x y.= 1 z.= 2[{x y z}]
f(0) //{0 1 2}
f(0 1 3) //{0 1 3} //yはデフォルトでいい

キーワード引数が無くて困るというのは、こういう場面だけだと考えたので、デフォルト引数の一種として扱ってみました。

f: `x :y.= 1 :z.= 2[{x y z}]
f(0) //{0 1 2}
f(0 :z 3) //{0 1 3} //yはデフォルト

シンボルリテラルに代入演算子が付いたものをキーワード仮引数と見做します。よって、デフォルト値無しのキーワード仮引数は作れません。
キーワード実引数の位置は完全に自由です。ほかの仮引数により消費済みのものもキーワード実引数候補になります。
キーワード仮引数は、ゼロの実引数を要し、すべての実引数を消費します。これは、キーワード仮引数がある場合、仮引数に存在しないキーワードを含めたあらゆる実引数が関数パターンマッチングを失敗させないことを意味します。

f: `x :y.= 1 :z.= 2[{x y z}]
f(0 2 3) //{0 1 2} //デフォルト
f(:y 10 :a 20) //{:y 10 2} //xは:yに; yは10に; :aの存在は無視

ShowMenuで!で始まるアイテムをチェックするようにした

グレー化は?で始まるアイテムに変更しました。

String.replaceとsearchをオーバーロードにした

引数がRegexと互換性(Regexそのものかas_Regexを持つ)が無い場合にContainerのそれが呼ばれるようになりました。

Container.(each|collect)_(ref|copy)を定義した

eachとcollectの仕様に変化はありませんが、eachがeach_refの、collectがcollect_copyのシノニムになりました。以前からあったcollect_without_copyはcollect_refのシノニムですが、無駄に長い名前なので、互換性のための非推奨メソッドになりました。
_copyは引数のメソッドを呼ぶときにその値をコピーして渡します。self.copy.eachだとすべてをコピーしてからeachするのでそれに比べて効率が悪くなります。

Object.caseを定義

ArrayとRangeのみ特別扱いになるswitchです。引数のオブジェクトのcase?を、selfを引数に呼びます。Object.case?は==を呼びます。ArrayとRangeのみ、case?がcontain?のシノニムになっているため、その値が含まれる場合にtrueとなります。

f: `x[x.case& {1 2 3}, 1, (4...6), 4, 6]
f(1) //1
f(2) //1
f(3) //1
f(4) //4
f(5) //4
f(6) //6
f(7) //6

括弧でコンマの演算子優先順位解決をできるようにした

コンマの機能は、"次の式を最近の演算子の引数にする"です。これは、

f& 1...2, 3

が、

f(1...(2 3))

と解釈されることを意味します。

f(1...2 3)

と解釈されたい場合に、括弧を使って、

f& (1...2), 3

と表現できるようになりました。
括弧の中に式が複数あるときはすべて評価され最後の値が、式がゼロのときは何も評価せずにNullが返ります。エラーにすべきかとも思うんですが、現状ではしてません。

f& (x 2), 3 //fには2と3が渡されるが、xも評価される。
f& (), 3 //fにはNullと3が渡される。

演算子化記号&と%の違いは、デフォルトの見えない括弧がどこまであるかと説明できます。

f& 1, 2.flush //f(1 2.flush)
f& 1, (2.flush) //f(1 2.flush)
f& 1, (2).flush //f(1 2).flush
f% 1, 2.flush //f(1 2).flush
f% 1, (2).flush //f(1 2).flush
f% 1, (2.flush) //f(1 2.flush)

Characterのデパースをある程度リテラル文字化した

今までは数値と型をそのまま表記してました。文字として表記できないものもあり得るので、isprintかisspaceがtrueの場合にリテラル文字化されます。

Object.thisを定義

selfを返します。何かに使いたくなって定義したはずなんですが、思い出せません。viewとか関数型言語的な何かだと思います。

Method.obeginを定義

obeginは出力(アウトプット)イテレータを返すメソッドを表す名前です。Method.obeginは代入時にselfを呼び出す出力イテレータを返します。

0...10.copy_into& `x[\A.inc(x).out].obegin Cout.flush //ABCDEFGHIJ

each等があるのであまり使いどころはありませんが、基本的なものなので用意しておきました。

Object.diagnosticizeを定義

Object.to_Stringのシノニムでもあるので、デフォルトのto_Stringでもあります。返すのは、#名前<オブジェクトID>です。オブジェクトIDというのは、オブジェクトごとの一意な値ですが、実際は単なるオブジェクトのポインタです。

Object.literalizeを定義

出来るだけリテラル化します。出来そうに無い場合はto_Stringの結果になります。to_Stringのデフォルトはdiagnosticizeなので、最低でもdiagnosticizeの情報は得られます。
ようするにRubyのpです。こちらのほうが解かりやすいので、エラーダイアログに表示されるオブジェクトの値はこれになりました。

Object.==を===のシノニムとして定義

ようするにデフォルトですべてのオブジェクトは==を持つようになりました。

Object.!=(x)をself.==(x).notとして定義

これにより、Object.==を定義すればObject.!=は定義の必要がなくなりました。(速度を気にしない場合。)

window:set-top-mostを定義

ちょっと必要になったんですが、Window.ToggleTopMostをいじるより楽だったので新たに定義しました。ここらへんを綺麗にまとめようという気はもう無いです。