原文:CSREPL - REPL for C#
在ChrisAn忙于将Python寄宿于AvPad之时,我在思考为什么他不把C#也同时考虑进去呢?
作为一项生存能力的测试,我在10分钟内,编写了一个简单的REPL程序,它支持C#表达式和语句的命令行解析。
下面是它的基本使用方法:
>1+2+3
6
>datetiR_479_11845@e.Now.ToString("T");
4:12:36 PM
为了支持交叉表达式变量,我定义了两个内置的函数,Set 和 Get:
>Set("X",32)
32
>Get("X")
32
为了支持调用任意的代码块,我定义了一个能够解析void(void) 代理的 Invoke方法:
> Invoke(delegate { for (int i = 0; i < 6; i++) Console.WriteLine(i); })
0
1
2
3
4
5
下面是原代码,在Whidbey Beta2下,将其编译为Console程序。
using
System;
System.Collections.Generic;
System.Reflection;
System.Text;
System.CodeDom;
System.CodeDom.Compiler;
namespace
csrepl
...
{
class Program ...{
static String funcprefix ="using System;
+public delegate void Proc(); public class Wrapper { public static object Set(String NAME, object value) { AppDomain.CurrentDomain.SetData(name, value); return value; } public static object Get(String Name) { return AppDomain.CurrentDomain.GetData(Name); public static object Invoke(Proc proC) { proc(); return null; public static object Eval() { return ;
funcsuffix ; } };
StringEval( expr) ...{
program expr funcsuffix;
ICodeCompiler compiler CodeDomProvider.CreateProvider(C#).CreateCompiler();
CompilerParameters cp new CompilerParameters();
cp.GenerateExecutable false;
cp.GenerateInMemory true;
CompilerResults results compiler.CompileAssemblyFromsource(cp, program);
if (results.Errors.HasErrors) ...{
(results.Errors[0].Errornumber ==CS0029)
returnInvoke(delegate { ; }));
results.Errors[].ErrorText;
}
else ...{
Assembly assm results.CompiledAssembly;
Type target assm.GetType(Wrapper);
MethodInfo method target.getmethod(Evalobject result method.Invoke(null, ? : result.ToString();
}
}
void Main([] args) ...{
while ( ) ...{
console.Write(> );
console.out.Flush();
console.ReadLine();
(expr break;
try ...{
StringEval(expr);
console.WriteLine(result);
}
catch (TargeTinvocationException eX) ...{
console.WriteLine(ex.InnerException.GetType().Name : ex.InnerException.messagE);
}
(Exception eX) ...{
console.WriteLine(ex.GetType().Name ex.messagE);
}
}
}
}
}
TrackBACk: http://tb.blog.csdn.net/TrackBACk.aspx?PostId=1726369