IronRuby と MRIの比較 (その2)

| コメント(0) | トラックバック(0) このエントリーを含むはてなブックマーク

引き続き IronRuby と MRI の比較を行いたいと思う。

動的に評価する際に必要となりそうな部分についての確認をする

07_eval.rb

a = 10
b = 20
str = "puts a+b"
eval( str )

興味のある部分は、evalの動作について。つまり動的に文字列を評価できるのか

module function Kernel.#eval eval(expr) -> object eval(expr, bind, fname = __FILE__, lineno = 1) -> object 文字列 expr を Ruby プログラムとして評価してその結果を返します。第2引数に Proc オブジェクトまたは Binding オブジェクトを与えた場合、そのオブジェクトを生成したコンテキストで文字列を評価します。 expr の中のローカル変数の扱いはブロックの場合と同じです。すなわち、eval 実行前に補足されていた変数は eval 実行後にブロック外に持ち出せます。

実行結果

C:\work>\ruby-1.8.7-p72-i386-mswin32\bin\ruby.exe -v mytest\07_eval.rb
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32]
30

C:\work>\ruby-1.9.1-p0-i386-mswin32\bin\ruby.exe -v mytest\07_eval.rb
ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32]
30

C:\work>\ironruby-0.9.1\bin\ir.exe -v mytest\07_eval.rb
IronRuby 0.9.1.0 on .NET 2.0.0.0
30

08_binding.rb

require 'pp'

def func3
	a = 100
	b = 200
	binding
end
def func2
	func3
end
def func1
	func2
end
bind = func1
a = 10
b = 20
str = "puts a+b"
eval( str )
eval( str , bind )

興味のある部分は、bindingの動作について

module function Kernel.#binding binding -> Binding 変数・メソッドなどの環境情報を含んだ Binding オブジェクトを生成して返します。通常、Kernel.#eval の第二引数として使います。

実行結果

C:\work>\ruby-1.8.7-p72-i386-mswin32\bin\ruby.exe -v mytest\08_binding.rb
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32]
30
300

C:\work>\ruby-1.9.1-p0-i386-mswin32\bin\ruby.exe -v mytest\08_binding.rb
ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32]
30
300

C:\work>\ironruby-0.9.1\bin\ir.exe -v mytest\08_binding.rb
IronRuby 0.9.1.0 on .NET 2.0.0.0
30
300

結論

この範囲においても差分がないようだ。良いことだ。

これ以外にも Thread の挙動について調べたが、それは以前に書いた通りなので割愛

トラックバック(0)

トラックバックURL: http://www.m-tea.info/mt-tb.cgi/10

コメントする

あわせて読みたいブログパーツ

このブログ記事について

このページは、k1ha410が2009年10月30日 20:26に書いたブログ記事です。

ひとつ前のブログ記事は「IronRuby と MRIの比較 (その1)」です。

次のブログ記事は「VMware Player 3.0 簡易インストール」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。