From: EGUCHI Osamu Date: 1997-09-27T18:54:39+09:00 Subject: [ruby-dev:558] Tail recursion (Re: optimize (...)) えぐち です。 ---------- > 件名 : [ruby-dev:549] Re: optimize (Re: Assigne to special variable) > > まつもと ゆきひろです > | obj = obj + m --> obj += m > | > |もピープホールの一種じゃないかな、これだけでもエバるときに > |若干手数が減ると思うです? > > 結局 obj += m は obj = obj + m に戻して評価してますからねえ. > それほど効果は出ないかも. eval のトラバースがちょっと減るですね、 > |また、メソッドのテールリカージョンは可能だとおもいます。 > > できます? 昔から野郎と思ってできないでいるんですけど.アイ > ディアだけでも大歓迎です. 教科書通り2分木のトラバースを例にとります、 class MyNode def initialize(key, info) @left = nil @right = nil @key = key @info = date end ... def print_all left.print_all print keyinspect, ":", info.inspect, "\n" right.print_all end end なんてありがちですよね、この MyNode#print_all は、 def print_all n = self while TRUE n.left.print_all print n.key.inspect, ":", n.info.inspect, "\n" break unless m.right n = m.right end end に置き換えられます。 (メンバアクセス関数の定義は端折ってます) 可能なのはクラス#メソッドが一致でかつ特異メソッドがない場合です。 これは eval の時までわからないです。 逆に eval が手抜きできるわけですが、検査コストは大きいでしょうか? また、これをしてまで call/return のオーバーヘッドは大きいのか不明です。 > |> たとえば現在のrubyではwhileなどの単純ループやclass/module定 > |> 義などでもsetjmpを使っています.この辺はパーザとの連係で減ら > |> せるのではないかと考えています.そのためにはrb_evalの非再帰 > |> 化が必要そうですけど. これって、そういったことですか? (テールリカージョンに限りませんが、、)