为什么会有这东西呢?请看这边:
LanguageProvider跑哪里去了?。我很“高兴”的发现我把日期的May看成Mar了,于是错过了好几个更新信息。呜呜。
错过的其中一个信息就是荒井省三对他所作的简单DLR语言的例子
对DLR Beta 2的更新。结果我傻乎乎的自己把那个例子针对change set 32648做了次更新。
诶,既然做了还是发出来吧。虽然一发出来就是过时的东西……
注意:下面的代码包里没有包含DLR的代码。请自行从
IronPython的源码发布页面下载change set 32648的源码来得到对应版本的DLR。
更新点:(相对
原始版本的)
1、命名空间变更。有部分DLR类从Microsoft.Scripting转移到了Microsoft.Scripting.Runtime里。
2、OptionsParser类的构造器参数有改变。受此影响MyCalcOptionsParser的构造器添加了context参数。
3、获取LanguageContext时不再通过ScriptDomainManager,而是像这样:
Program.cs: MyCalcConsole.Initialize()
this.Options.ScriptEngine = Environment.GetEngine( typeof( MyCalcLanguageContext ) );
4、不再直接使用ScriptDomainManager之后,MyCalcHelper类中的Print方法的参数也相应更新:
public static void Print( CodeContext context, object o ) {
context.LanguageContext.DomainManager.
SharedIO.OutputWriter.WriteLine( o ?? "<null>" );
}
5、应对helper的变更,为Print类中Ast.Call()添加context参数。同时,去除Print类的Generate方法中的Statement包装,直接返回Expression。
protected internal DlrAst.Expression Generate( ) {
return DlrAst.Ast.Call(
typeof( Runtime.MyCalcHelper ).GetMethod( "Print" ),
DlrAst.Ast.CodeContext( ),
DlrAst.Ast.ConvertHelper( _exp, typeof( object ) )
);
}
这里我没弄明白作者原本为什么会写上了这个包装,但作者自己似乎也发觉这个包装没用而在后来的更新中将其去除了。
7、将原本用到CodeBlock的地方全部更新为使用LambdaExpression。同时,为了生成LambdaExpression,需要用到LambdaBuilder;用Ast.Lambda()来得到LambdaBuilder。
8、把所有Microsoft.Scripting.Ast命名空间用DlrAst的别名代替,将没有使用的命名空间的using语句去除,并且对所有源代码做了适合我自己的习惯的格式化。
9、在Token类里添加了一个静态成员_empty,当需要空token的时候直接返回这个单一实例(而不重复构造空token)。
==============================================================================
以上的一些更改在DLR Beta 2中已经不再适用。例如说ConsoleHost类不再拥有Initialize()方法,换为CreateEngine()方法,并且增加了CreateCommandLine()。另外一个很重要的变化是工厂类Microsoft.Scripting.Ast.Ast被废除,其中的工厂方法都被整合到了Microsoft.Scripting.Ast.Expression(也就是DLR的Ast体系的基类)中。
==============================================================================
荒井省三的blog上使用DLR制作一个简单语言系列:
簡単な言語の作り方1
簡単な言語の作り方2
簡単な言語の作り方3
簡単な言語の作り方4
簡単な言語の作り方5
簡単な言語の作り方-まとめ-
DLRで簡単な言語を作る -ベータ1用に修正しました-
DLR beta2 を使ったホスティング
==============================================================================
顺便对荒井省三针对DLR Beta 2的更新也做了类似的一些适合我自己习惯用的变更,顺便发上来吧。