针对Change Set 32648而更新的荒井省三的简单DLR语言例子

为什么会有这东西呢?请看这边:[url=http://rednaxelafx.iteye.com/blog/192320]LanguageProvider跑哪里去了?[/url]。我很“高兴”的发现我把日期的May看成Mar了,于是错过了好几个更新信息。呜呜。

错过的其中一个信息就是荒井省三对他所作的简单DLR语言的例子[url=http://blogs.gotdotnet.com/shozoa/archive/2008/05/08/hosting_2D00_dlr_2D00_beta2.aspx]对DLR Beta 2的更新[/url]。结果我傻乎乎的自己把那个例子针对change set 32648做了次更新。

诶,既然做了还是发出来吧。虽然一发出来就是过时的东西……
[b]注意[/b]:下面的代码包里没有包含DLR的代码。请自行从[url=http://www.codeplex.com/IronPython/SourceControl/ListDownloadableCommits.aspx]IronPython的源码发布页面[/url]下载change set 32648的源码来得到对应版本的DLR。

更新点:(相对[url=http://blogs.gotdotnet.com/shozoa/attachment/7459587.ashx]原始版本[/url]的)

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制作一个简单语言系列:
[url=http://blogs.gotdotnet.com/shozoa/archive/2008/02/02/7383648.aspx]簡単な言語の作り方1[/url]
[url=http://blogs.gotdotnet.com/shozoa/archive/2008/02/03/7401868.aspx]簡単な言語の作り方2[/url]
[url=http://blogs.gotdotnet.com/shozoa/archive/2008/02/03/7407408.aspx]簡単な言語の作り方3[/url]
[url=http://blogs.gotdotnet.com/shozoa/archive/2008/02/04/7432482.aspx]簡単な言語の作り方4[/url]
[url=http://blogs.gotdotnet.com/shozoa/archive/2008/02/05/7459587.aspx]簡単な言語の作り方5[/url]
[url=http://blogs.gotdotnet.com/shozoa/archive/2008/02/17/7741759.aspx]簡単な言語の作り方-まとめ-[/url]
[url=http://blogs.gotdotnet.com/shozoa/archive/2008/04/17/mycalclanguage-for-dlr-beta1.aspx]DLRで簡単な言語を作る -ベータ1用に修正しました-[/url]
[url=http://blogs.gotdotnet.com/shozoa/archive/2008/05/08/hosting_2D00_dlr_2D00_beta2.aspx]DLR beta2 を使ったホスティング[/url]

==============================================================================

顺便对荒井省三针对DLR Beta 2的更新也做了类似的一些适合我自己习惯用的变更,顺便发上来吧。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值