Saturday, June 18, 2011

Write a patch!

This is my first report; 最初のレポートをお届けします.

[ruby-dev:43834] new deadlock detection


ko1 proposed a new deadlock detection method with patch.

How it works


  • "Thread waker" changes sleeper
  • Only compareing living thread num and sleeper is needed for detection

Asset


  • Deadlock detection code is more beautiful than currents.

Patch


patch is in mail (base64 encoded)

[ruby-core:37164] Enumerable#lazy


(1..100).map{|x| 長い文字列等を生成する作業 }.select{|x| それを選択する作業 } 等だと,まず Enumerable#map を実行して
中間配列を生成,そしてその配列を Enumerable#select に渡すのですが,長い文字列等を作り配列にするとかなりのメモリを消費するため,
生成した物を中間配列を生成せずにそのまま次の Enumerable#select に渡したいよね,という話は前から上がっていた. (後述の rude_map もそれ)

Enumerable#rude_map なども良いが,見た目カッコ悪い.どうせなら別のEnumeratorを生成して,綺麗にどんなメソッドでも遅延評価できると良いのでは? という案もあった.

このチケットはその案,Enumerable#lazy を実装し, (1..100).lazy.map{|x| 長い文字列等を生成する作業 }.select{|x| それを選択する作業 } などで好きなEnumerableメソッドを遅延評価できる.

Enumerable#lazyEnumerable::Lazy クラスのオブジェクトを返します.

Enumerable::LazyEnumerable のサブクラスで,Enumerableをインクルードしています.そのためあなたはLazyでもEnumerableと同じメソッドを利用することができるそうです. (ただし一部のメソッドはLazyで再実装されている物もあります)

Ruby での実装 (動作を確認するための仮の実装) lazy.rb

あわせて読みたい #4653 Enumerable#rude_map

[ruby-core:37170] Literal Instantiation breaks Object Model


例えば String.new ではinitialize呼ばれるのに,リテラルから生成した場合呼ばれないじゃねーか.と

リテラル化するときもRubyレベルで定義されたinitialize呼ぶべきじゃないでしょうかー.というバグ(提案?)

バグには見えないし,対応する理由も特に見当たらないのでReject.奥義「パッチを書いてこい」

No comments:

Post a Comment