以前、DLRで簡単な言語を作るというものを説明しました。この時に使用したDLRは、A7あるいはA8でした。3月にベータ1が公開されたのは、皆様もご存じだと思います。そこでベータ1で動作するようにコードを書き換えてみました。簡単に変更点を説明したいと思います。最初にConsoleのInitializeメソッドです。
this.Options.ScriptEngine = Environment.GetEngine( typeof(Runtime.MyCalcLanguageContext));
public override Microsoft.Scripting.Ast.LambdaExpression ParseSourceCode(CompilerContext context) { string code = context.SourceUnit.GetCode(); context.SourceUnit.CodeProperties = SourceCodeProperties.None; LambdaBuilder codeblock = Ast.Lambda( "<mycalclblock>", typeof(object)); codeblock.Body = Parser.MyCalcParser.ParseCode(code); return codeblock.MakeLambda(); } public override ServiceType GetService<ServiceType> (params object[] args) { if (typeof(ServiceType) == typeof(OptionsParser)) { return (ServiceType) (object)new Hosting.MyCalcOptionsParser(this); // A8向け // (object)new Hosting.MyCalcOptionsParser(); } 以降は同じです。
public MyCalcOptionsParser( Runtime.MyCalcLanguageContext context) : base(context) { }
public static void Print( CodeContext context, object o) { context.LanguageContext.DomainManager. SharedIO.OutputWriter.WriteLine(o ?? "<null>"); }
protected internal Expression Generate() { Expression print = Microsoft.Scripting.Ast.Ast.Call( typeof(Runtime.MyCalcHelper).GetMethod("Print"), Microsoft.Scripting.Ast.Ast.CodeContext(), Microsoft.Scripting.Ast.Ast.ConvertHelper( _exp, typeof(object))); return print; }
PingBack from http://microsoftnews.askpcdoc.com/?p=3019