微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Silverlight的中文显示问题

原文:CSREPL - REPL for C#  

ChrisAn忙于将Python寄宿于AvPad之时,我在思考为什么他不把C#也同时考虑进去呢?

作为一项生存能力的测试,我在10分钟内,编写了一个简单的REPL程序,它支持C#表达式和语句的命令行解析。

下面是它的基本使用方法
>1+2+3
6
>DateTime.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 @H_1000_502@...
{

                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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐