« 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

<March 2010>
SunMonTueWedThuFriSat
28123456
78910111213
14151617181920
21222324252627
28293031123
45678910

Archives

March, 2010 (10)
February, 2010 (17)
January, 2010 (13)
December, 2009 (13)
November, 2009 (7)
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