日記帳だ! with Tux on Libserver

二度目の大改造!! 日記帳…か?を継承し、より柔軟でパワフルなBlogに変身しました。

RSSに対応しています。リンク・コメント・トラックバックは自由にしていただいてほぼ問題ありません。
RSS購読方法、僕のリンク・コメント・トラックバックについての考えを読むことをおすすめします。

JavaScriptを有効にし、Cookieを受け入れ、以下のブラウザを使うことで完全なコンテンツが楽しめます。
Mozilla Firefox 3.0(Get Firefox)・Opera 9.6・Safari 3.2・Lunascape 4/5(Gecko)・Lunascape 5(WebKit)
Internet Explorer 7/8とそれを使うIEコンポーネントブラウザ(Lunascape・Sleipnirなど)

IronRubyを試してみる

コンピュータはなんでエネルギーを消費するんだろうかってのはかなりの疑問ですよね。
計算結果にエネルギーが蓄えられるわけではないですし。
まぁ実のところ熱になっているだけで、そうとするならばコンピュータは暖房だということになる。
最近は低消費電力のCPUとか流行ってますけど、そりゃ当然のことではありますよね。
だって究極的には電力いらないはずなんだから。
白熱電球がいかに効率が悪いと言われても、あれは光というエネルギーに変換されてるわけですから。
さて、なんかIronRubyとかあるので試してみた。
IronRuby
IronPythonのパクリのような気もしますが、まぁそういうものです。
iirbを起動してみた。IronRubyのirbだからiirbなんですね。
あと本体の名前はirなんだね。多分IronRubyだからってirbにしたら対話的コンソールのirbとかぶるからだと。
起動遅いですけど、これは.NET Frameworkの初期化が結構遅いというのが理由かなと。
IronPythonのもっとも残念だったのはそこだと思います。それはIronRubyでも一緒ですね。
まぁ.NET Framework 4.0からDLRの内蔵が始まるみたいだからこれによって速くなったらうれしいなとかいうのはある。
それまでは残念ですが広く使うのは難しそうです。
起動したら普通のRubyのようにirbできるはず。
p (1..100).map{|x| x**2}.inject(0){|s,i| s+i}
基準となってるRubyのバージョンはよくわからないけど1.8.7以前であることは間違いないでしょう。
さてここからがむしろポイントで.NETのライブラリを使えるよって所です。
まぁ試してみましょうか。
System::Console.WriteLine "Foobar".GetType.ToString
fs=System::IO::StreamReader.new('C:\work\req.txt')
begin
puts fs.read_to_end
ensure
fs.Close
end
a=System::Array[System::Int32].new(10)
(0..a.Length-1).each do |i|
a[i]=i**2
end
puts a.inject(0){|s,i| s+i}
l=System::Collections::Generic::List[System::Int32].new(a)
f=System::Action[System::Int32].new do |x|
x.times do
print "#{x}"
end
print "\n"
end
f.Invoke(10)
l.ForEach(f)
まず、Rubyのオブジェクトの型を聞いてみると、IronRuby.Builtins.MutableStringという。
IronPythonではこれについてはSystem.Stringであると言ってきたので違いますね。
ところでRubyではメソッドの呼び出しに括弧は不要なのでこんな調子でOKです。
一見するとメソッドかプロパティか区別がつきませんが、これはRubyのよいところではありますね。
System::Console.WriteLineというのはちょっと変わった表記ですね。なんで::やねんと。
どうもIronRubyではクラス名まではこう書くみたいです。
System::ConsoleってのはRubyの言葉で言うと、Class型のオブジェクトなんですね。
まぁ.NETなんかの感覚だとわからないけど、Rubyとかはクラス名自体がオブジェクトなんですね。
というかクラスの定義自体Classクラスの拡張という形でやっているはずだし。
なのであえてSystem::ConsoleのWriteLineメソッドっていうわけでSystem::Console::WriteLineとは書いてません。
実際はSystem::Console::WriteLineでも使えるんですけどね。
それでStreamReaderを使ってみましたが、特にusing構文はないよと。
そういうわけでRubyのbegin~rescue~ensure~end構文で書いています。
Pythonではwith構文ってのが追加されたはずだけどRubyではそんなものいらないので。
ところで.NETってメソッド名はReadToEndのように書きますけど、Rubyではread_to_endのように書くんですね。
これを読み替えて使えるみたいです。
Ruby使いにも親しみやすいようにとのこと。
ジェネリックな型はSystem::Collections::Generic::List[System::Int32]のように書きます。
そういえばIronPythonもこうでしたね。
それで配列もSystem::Array[System::Int32]のようにかけるようになっています。
配列の作成は個数指定でやるのは普通にnewでいけますね。
ただRubyの配列からのコピーはどうやってやるんだろ。この辺はIronPythonと逆ですね。
Rubyといえばブロック付きメソッド呼び出しですが、これはデリゲートの作成に使えます。
できたデリゲートはRubyのProcみたいにf[10]とかできるかと思いきやできない。
残念。こうやってInvokeメソッド使えばいいですね。
List<T>のForEachメソッドに渡しているが、この引数を省略してブロック付きメソッド呼び出しではだめみたい。
まだかゆいところに手が届かないという感じではありますけど悪くはないですね。
最後のデリゲート型の引数を省略してブロック付きメソッド呼び出しできるようにしたり、
RubyのArrayと.NETのArrayの変換を簡単にしたりというのはやってほしいものですが。
まぁIronPythonも当初は散々でしたから今後改善される分もあるでしょうし。
ただ何よりも問題なのは初期化に時間を食うこと。
それさえ無ければ全部IronRubyのアプリケーションを作ったりしても楽しいと思うんだけどな。
まぁ最近は.NETで開発しなきゃいけないことは減りましたけど、やっぱりWindowsフォームは.NETで作ると楽ですからね。
この辺でIronRubyとか活用して行けたらと思うのだけど…
まぁ期待しておきましょう。
Author : hidemaro
Date : 2009/05/09(Sat) 23:42
Windows・Microsoft | Comment | trackback (0)

Tools