[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 メーリングリストの案内