4月に出すつもりだったRuby 1.8のリリースが遅れている。 自分の誕生日に出すつもりだったのだが。
リリースが遅れている理由はふたつある。 ひとつはリリースマネージメントの問題だ。 つまり、私はリリース前になにをなすべきかを十分に把握していないことだ。 これについてはこれから文章化して明確にして行こうと思っている。
もうひとつはもうちょっと深刻で、私が内心ではリリースを望んでいないことだ。 より正確には、望んでいないのはリリース前のfeature freezeだ。 私が一番関心があるのは言語をよりよくすることで、 「よりよく」には本質的に変化が伴うので、 変化を止めてしまうfeature freezeは嬉しくないのだ。
ここにもまた矛盾がある。
Ruby 1.8にこれから加えるかもしれない最大の変更がこれだ。 現時点ではProcクラスにはcallメソッドと新たに追加されたyieldメソッドがある。
本人はこれで満足していたのだが、 David Alan Blackが「yieldって名前はおかしい」と指摘したので少々話がややこしくなった。 とはいえ、まだ名前に対する考えはそれぞれだし静観してればよいと思っていたのだ。 しかし、[ruby-talk:70220]で「BlockとProcを導入する」というアイディアを見て考え直した。
callとyieldの両方のメソッドを持つということは、 呼び出し側がある手続きオブジェクトを手続き的に呼びたいか、ブロック的に呼びたいかを決めることを意味する。 しかし、実際には手続き的に呼ばれるもの(lambdaで生成されたものとか)と、 ブロック的に呼ばれるもの(ブロック引数で得られるものとか)は、はっきり異なるのではないか、 別の言い方をすると、手続き的に呼びたいか、ブロック的に呼びたいかは、 呼び出され側が決めるべきことではないかと。 別の呼び出し方がしたい場合には明示的に変換すると。
考えれば考えるほどこっちの方が妥当のように思えてきたのだが(1.6からは上位互換だし)、 変更が相当大規模になるので尻込みしているのだった。
これも懸案のひとつ。instance_methodsなどと一貫性を持たせるため、 methodsもrecurseするかどうか指定できる引数を追加するという Dave Thomasの案をとりあえず採用したのだが、 この場合特異メソッドはどうなるのだろうか。
現状では
を返すと言う「実装の都合で支離滅裂」な挙動になっているから、 変えなくちゃいけないのは確かだが、問題はどう変えるのか、だ。
追記(2003-05-06): 結局、デフォルトと真のときにはすべてのメソッド、 偽の時には特異メソッドのリストを返すことにしてみました。