2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Booでevaる。

Last updated at Posted at 2013-07-18

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}"
""" 

結論

かっこいい読み方は「エヴァる」。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?