[DLR]IronPython 2.0A3の調べごと

前回のエントリーでIronPython 2.0A3がリリースされたことをお知らせしました。リリースノートによると、IronRuby1.0プレアルファに含まれるDLRと同期したバージョンだと記載がされています。このA3を使って作成済みの資料に影響があるかどうかを調べています。結果としてはASTレベルでは、特に影響は見られませんでした。ほっと一息をついたのですが、色々と調べていくと生成されるILレベルでは、変化が見られました。このことは、DLRの中に関する変更が行われたということを意味しています。どういう変更かは、生成されるILをA2と較べてみていただければ理解できるかと思います。

せっかくなのでIronRubyと同居できるかを試してみました。自分でビルドしたipy.exeとIronPython.dll、IronPython.Modules.dllをIronRubyをビルドしたフォルダにコピーして、ipy.exeを動かしてみました。結果は問題なく動作しました。動作するということは、IronPythonからRubyのスクリプトを使ってみようと実験してみました。試したコードは、以下のようなものです。

 import clr
r = clr.Use("test.rb", "rb")
# 実行した結果が表示されます。

Rubyのスクリプトを実行することはできました。が、clr.Useの戻り値を格納した変数rをdir関数で確認すると「#rfc」というメンバーが表示されます。何だろうと思って調べると「RuntimeFlowControl」オブジェクトでIronRubyのRuntimeが提供するオブジェクトだとわかりました。実行したスクリプトは、以下のようなものです。

 def test(a)
  return a + " ,Hello"
end

puts test "IronRuby"

このスクリプトで定義した関数(メソッド)であるtestがIronPythonから見えてないんですね。ふーむと考えながらスクリプトに「x= "IronRuby"」を追加して試してみると「r.x」で変数xに対してはアクセスすることができます。でも「#rfc」も表示されています。これを調べるためにrbx.exeのオプションである「-X:ShowASTs」か「-X:DumpASTs」を使用してIronRubyのASTを確認してみました。すると、「Variable」ノードに「#rfc」が定義されているのがわかりました。IronRubyのVariableノードをIronPythonはdir関数で参照していたのです。リテラルを定義した変数は参照できますが、オブジェクトや関数は現在のASTでは参照できないようです。

PS.John LamのBlogにIronRuby1.0プレアルファリリース後のフィードバックのまとめのようなエントリが掲載されています。いきなり現在の実装のバグを直したりと色々な反応が見られます。後、Windows.Formsを利用するのに「require 'System.Windows.Forms'」と記述できると書きましたが、内部でアセンブリ識別子に置き換えていました。ですから、現在のプレアルファでは、アセンブリ識別子を記述するのが正しい方法のようです。