NotMuchofAREPL - CSREPL back-ported for .NET 1.1
Lately Don Box has been exploring just how dynamic a language C# can be.
Here's his REPL for C# code, with backward changes so you can play with it on .NET 1.1 since 1.1 doesn't have anonymous delegates.
I call it NotMuchOfAREPL. Diffs highlighted. I haven't run that many expressions through it so be warned. That said, it's pretty slick. There's a lot of untapped potential in the language (and that wouldn't require IL changes) that could be unlocked with a few new keywords. It's a very exciting time.
1 using System;
2 using System.Reflection;
3 using System.Text;
4 using System.CodeDom.Compiler;
5
6 namespace notmuchofarepl
7 {
8 class Program
9 {
10 static string funcPrefix = "using System;\r\n"
11 + "public delegate void Proc();\r\n"
12 + "public class Wrapper { \r\n"
13 + " public static object Set(string name, object value) { \r\n"
14 + " AppDomain.CurrentDomain.SetData(name, value);\r\n"
15 + " return value; \r\n"
16 + " }\r\n"
17 + " public static object Get(string name) { \r\n"
18 + " return AppDomain.CurrentDomain.GetData(name);\r\n"
19 + " }\r\n"
20 + " public static object Invoke(Proc proc) { \r\n"
21 + " proc();\r\n"
22 + " return null; \r\n"
23 + " }\r\n"
24 + " public static void notSoAnon() { \r\n";
25 static string funcInter = " ;"
26 + " }\r\n"
27 + " public static object Eval() { return ";
28 static string funcSuffix = "; \r\n} }";
29
30 static string StringEval(string expr, string voidExpr)
31 {
32 string program = funcPrefix + voidExpr + funcInter + expr + funcSuffix;
33
34 ICodeCompiler compiler = new Microsoft.CSharp.CSharpCodeProvider().CreateCompiler();
35
36 CompilerParameters cp = new CompilerParameters();
37 cp.GenerateExecutable = false;
38 cp.GenerateInMemory = true;
39
40 CompilerResults results = compiler.CompileAssemblyFromSource(cp, program);
41 if (results.Errors.HasErrors)
42 {
43 if (results.Errors[0].ErrorNumber == "CS1525")
44 return StringEval("Invoke(new Proc(notSoAnon))",expr);
45 return results.Errors[0].ErrorText;
46 }
47 else
48 {
49 Assembly assm = results.CompiledAssembly;
50 Type target = assm.GetType("Wrapper");
51 MethodInfo method = target.GetMethod("Eval");
52 object result = method.Invoke(null, null);
53 return result == null ? null : result.ToString();
54 }
55 }
56
57 static void Main(string[] args)
58 {
59 while (true )
60 {
61 Console.Write("> ");
62 Console.Out.Flush();
63 string expr = Console.ReadLine();
64 if (expr == null)
65 break;
66 try
67 {
68 string result = StringEval(expr, String.Empty);
69 Console.WriteLine(result);
70 }
71 catch (TargetInvocationException ex)
72 {
73 Console.WriteLine(ex.InnerException.GetType().Name + ": " + ex.InnerException.Message);
74 }
75 catch (Exception ex)
76 {
77 Console.WriteLine(ex.GetType().Name + ": " + ex.Message);
78 }
79 }
80 }
81 }
82 }
About Scott
Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.
About Newsletter
Comments are closed.