evalが欲しい
Boo以外のプログラミング言語によくある eval は無くてもなんとかなることは多いですが、稀にどうしても欲しくなるときがあります。
実装
次のプログラムは引数の文字列 Boo プログラム prog を実行するメソッド eval です。prog は、eval() を実行した環境のロード済みアセンブリと同じものをロードした状態でコンパイルされます。
import Boo.Lang.Compiler
import Boo.Lang.Compiler.IO
def eval( prog as string ):
compiler = BooCompiler() # コンパイラ作る。
p = compiler.Parameters
p.Pipeline = Pipelines.CompileToMemory() # memory上にアセンブリ出力するコンパイラパイプライン。
# 今実行中の環境にロードされているアセンブリをコンパイル時に参照する。
for asm in System.AppDomain.CurrentDomain.GetAssemblies():
p.References.Add( asm )
p.Input.Add( StringInput( 'テキトーな名前', prog ) ) # evaるプログラムを入力にする。
result = compiler.Run() # コンパイル。
result.GeneratedAssembly.EntryPoint.Invoke( null, (null,) ) # 結果の実行開始ポイントになるメソッド起動。
こんな風に使います。
eval """
a = "hello world!"
print "a=${a}"
"""
結論
かっこいい読み方は「エヴァる」。