[SML 7139] Re: 並び替えの致命傷
Katsuyuki Saegusa
saegusa @ saesoft.jp
2006年 2月 25日 (土) 08:59:12 JST
[SML 7132] 並び替えの致命傷のメール
Smalltalkのクラスの勉強になりました。
私はまだ従来の言語的な思考から抜け出せないのかも
しれませんので、皆様の意見をお願いします。
整列している・していないコレクションに、1個だけ追加したい
場合もあるし、いっぺんに沢山入れたい場合もあります。
そのたびに、SortedCollectionとOrderdCollectionを変換しあう、
というのも、そそっかしい私には、難しい作業のように思います。
もし、標準のクラス?に自分が手を加えられるなら、こういう仕様に
したいな、と思ってしまいます。
1)OrderdCollectionの場合、quickSortメソッドがあると...
aLiteralArray := #(0 9 1 8 2 7 3 6 4 5).
aOrderdCollection := OrderedCollection new.
aLiteralArray do: [:each | aOrderdCollection add: each].
aOrderdCollection quickSort: [:n1 :n2 | n1 >= n2].
私家版をつくるならaddArray,quickSortを加えて...
aLiteralArray := #(0 9 1 8 2 7 3 6 4 5).
aOrderdCollection := OrderdCollection new.
aOrderdCollection
addArray: aLiteralArray;
quickSort: [:n1 :n2 | n1 >= n2].
2)SortedCollectionの場合、ソートのロックができると...
aLiteralArray := #(0 9 1 8 2 7 3 6 4 5).
aSortedCollection := SortedCollection new.
aSortedCollection sortBlock: [:n1 :n2 | n1 >= n2].
aSortedCollection lockSort.
aLiteralArray do: [:each | aSortedCollection add: each].
aSortedCollection unlockSort.
私家版をつくるならaddArrayリバーシングを実装して
先頭と最後にlock,unlockをいれてしまおう...
aLiteralArray := #(0 9 1 8 2 7 3 6 4 5).
aSortedCollection := SortedCollection new.
aSortedCollection
sortBlock: [:n1 :n2 | n1 >= n2];
addArray: aLiteralArray.
みたいに書けるとおっちょこちょいでもOKだ、と思ってしまうのです。
ところで、こういった変更を「標準のライブラリ」に施すことは
行儀の良い作法とは言えない気がするのですが、どのように
するのが良いのでしょうか。
現在私は、クラスのソースが全てあって、依存関係のない実行形式
1個を大変高速に出力できるコンパイラを使っている場合は、
気に入らないライブラリは全部触ってビルドしなおします。
あるいは、状況によってはソースをフォークして
MySortedCollectionみたいなのを作ってみたり。
ただ、そうなってくると開発環境がアップデートするとバグを迂回した
ところが違う実装になってたりして、全ソースの差分をとるのが
結構大変です。勉強にはなりますが。。。
K.Saegusa
SML メーリングリストの案内