Ruby 1.9.3 がリリースされました([ruby-dev:44712] [ANN] Ruby 1.9.3-p0 is out).
yugui さんをはじめ,関係者の方々は本当にお疲れ様でした&ありがとうございました.
これから,Ruby 2.0 へ加速していくことになると思います.すでに,Ruby 2.0 のリリースプランも発表されており([ruby-dev:44691] A rough release schedule for 2.0.0),議論が活発になっていくと思います.ちなみに,このプランで特筆すべきは 2012 年 8 月までに議論が収束しない仕様は,2.0 から入らない,という決定です.否応にも,新仕様について,議論が深まろうというものです.
期限を過ぎても「入れちゃえー」,というノリだった Ruby 開発陣ですが,ここはリリースマネージャに就任された遠藤さんの手腕が問われるところではないかと思います.
世の中には blog というものがあるらしいのだけど,さて何を使うのがいいのかなぁ.hatena にできるらしいサービスを待ってみる? でも hatena の id はいいの取れなかったんだよな.
2.0 でやりたいリスト.書かないと忘れちゃう.
これ1人でやるのはしんどいなぁ.これは,8 月じゃなくて 10 月くらいまでの課題だろうか.全部はできないんだろうなあ.
Ruby の仕様レベルでは,ClassLoader というか,そういうのをやりたいんだけど,これを決めるのは経験と時間が足りないから無理だろうなぁ.
load の toplevel module を無名モジュールにする(load の第2引数),ってのは前からあるわけですが,それだと monkey patch に対応できないわけです(monkey patch は original の名前空間に影響してしまう).
そこで,新しい定数空間を作って,class/module は dup してしまう(dup じゃなくて,継承的なものでもいいかもしれないが),というのはどうかと思ったわけです.で,require して定義された feature(クラス定義,メソッド定義等)は,その空間の中でしか定義されないわけです.
新しい定義は新しい定数空間でしか有効にならない,monkey patch,例えば String クラスのメソッドを書き換えても,それはその定数空間の String にしか有効にならないわけです.
定数空間は動的に切り替えることができるようにします.最初は FeatureSpace という名前で考えていたけど,NameSpace とか ConstantSpace とか,適切な名前があるような気もするんだけど,よくわからない.
とまぁ,考えてはみたのですが,あまり練れてないので,多分 8 月には間に合わないだろうし,反対意見も沢山出てくるだろうしなぁ.
これがあると,綺麗に load した feature を消せるんですよね.つまり,reload みたいな処理が綺麗に書けるわけです.
C = FeatureSpace.new{ class Integer def /(o) Ratioanl(self, o) end end class C def foo 1/2 end end 1/2 #=> 1/2 C } C.new.foo #=> 1/2 1/2 #=> 0
FS1 = FeatureSpace.new{ class String def hello "Hello #{self}!" end end } FS1.eval{ "ko1" }.hello #=> "Hello ko1!" "nurse".hello #=> NoMethodError
こんな感じ.
聞きかじりの知識ですが,JVM の ClassLoader も,似たような機能だとか(型検査が厳しいので ClassLoader 間でオブジェクトが移動できないとかあったような気がするので,Ruby だともっと柔軟にできるんじゃないか,という発想).ただ,ClassLoader 自体に色々問題点もあるらしいけど私はさっぱりそれらを知らないので,それがとてもダメな点.
UTF8_StringSpace = FeatureSpace.new{ class String def length self.force_encoding('utf8').length end end class Plugin1 def self.length(str) str.length end end } str = 'あいうえお' UTF8_StringSpace.eval{ Plugin1.length(str) #=> normal length called }
こういうケースでは新しい length を呼んで欲しい気がするのでダメかなあ.
あと,実装的には IMMEDIATE な値はどうしようもない気がする(新しいクラス定義を持たせられない).RVALUE な fixnum はコスト高杉だよなぁ.
うーん,ダメかな−.定数空間自体をなんか柔軟に弄る仕組みがあると面白いんじゃないかと思うんだけど.
別の設計として,FeatureSpace の中で実行する全ての挙動は,FeatureSpace で定義された定数空間でしか実行できない,ってものなんだけど,それだと FeatureSpace 間の通信が面倒というか.
バージョン違いのライブラリを,それぞれ FeatureSpace を分けてロードしてあげれば,複数のバージョンが共存できる,とかなんとか.
Module#dup に deep copy 版があればいいって話なのかもしれないなぁ.まぁ,それ以外にもリテラルどうするとか,そういう細かい話はあるが.それと,require に「これ以下でロード」機能を提供するとかあれば,色々.
今回の失敗.
その他,いろいろ.
RubyConf 2011 が終わり.
相変わらず,知らない人とは絡めないのは,英語のせいかと思ったけど,日本でだって絡めてないんだから,やはりこれは生来のボッチ気質なのだと思う.
Ruby 2.0 に向けて加速しだした気がする.