Giraffe+ 0.5.63.791
前リリースからの変化
- 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をいじるより楽だったので新たに定義しました。ここらへんを綺麗にまとめようという気はもう無いです。