« Ah, crap... | Main | Upgrading FreeTextBox on dasBlog without... »

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



Comments are closed.

Contact

Sponsors

Hosting By

Hot Topics

Tags

Calendar

<November 2009>
SunMonTueWedThuFriSat
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

Archives

November, 2009 (5)
October, 2009 (19)
September, 2009 (11)
August, 2009 (12)
July, 2009 (21)
June, 2009 (26)
May, 2009 (16)
April, 2009 (13)
March, 2009 (17)
February, 2009 (17)
January, 2009 (18)
December, 2008 (32)
November, 2008 (17)
October, 2008 (22)
September, 2008 (16)
August, 2008 (14)
July, 2008 (25)
June, 2008 (19)
May, 2008 (17)
April, 2008 (17)
March, 2008 (26)
February, 2008 (21)
January, 2008 (28)
December, 2007 (19)
November, 2007 (17)
October, 2007 (31)
September, 2007 (39)
August, 2007 (37)
July, 2007 (43)
June, 2007 (37)
May, 2007 (32)
April, 2007 (38)
March, 2007 (29)
February, 2007 (46)
January, 2007 (31)
December, 2006 (27)
November, 2006 (31)
October, 2006 (32)
September, 2006 (39)
August, 2006 (34)
July, 2006 (40)
June, 2006 (18)
May, 2006 (31)
April, 2006 (34)
March, 2006 (30)
February, 2006 (38)
January, 2006 (44)
December, 2005 (19)
November, 2005 (34)
October, 2005 (24)
September, 2005 (37)
August, 2005 (20)
July, 2005 (24)
June, 2005 (33)
May, 2005 (16)
April, 2005 (22)
March, 2005 (34)
February, 2005 (15)
January, 2005 (37)
December, 2004 (28)
November, 2004 (30)
October, 2004 (34)
September, 2004 (22)
August, 2004 (34)
July, 2004 (18)
June, 2004 (64)
May, 2004 (49)
April, 2004 (21)
March, 2004 (29)
February, 2004 (29)
January, 2004 (36)
December, 2003 (25)
November, 2003 (24)
October, 2003 (59)
September, 2003 (42)
August, 2003 (24)
July, 2003 (44)
June, 2003 (29)
May, 2003 (21)
April, 2003 (30)
March, 2003 (27)
February, 2003 (47)
January, 2003 (50)
December, 2002 (31)
November, 2002 (38)
October, 2002 (44)
September, 2002 (15)
May, 2002 (2)
April, 2002 (4)

Google Ads