ironpython console_[集成IronPython] 添加方法到运行环境

动态类型语言(以下简称:"动态语言"),在10年前就已流行起来。JavaScript更是成为了WEB前台开发的事实标准。但它们进入普通开发 人员的视野也就在近几年。随着Web2.0和敏捷开发方法论的兴起,动态语言的灵活高效的特性成为了它被更多项目选择和使用的理由。一些大型网站已开始使 用动态语言来实现,其中,国内比较优秀的作品有“豆瓣”。微软更是不甘落后,建立了DLR(动态语言运行时)来吸引动态语言爱好者在其上实现动态语言。IronPython就是其主要成员之一。

在本系列文章中,我们将逐步实现一个自定义控件,实现类似IDE的Immediate窗口的功能。用户可以在其中输入和运行IronPython代码。 【返回目录】

在上一节中,我们成功的将CLR对象添加到了IronPython的运行环境中。相信通过上一节的内容。大多数人都已经可以很容易的将IronPython集成到自己的应用程序中。但是,某些时候,我们为了给我们的用户以更好地体验。需要对IronPython进行一些扩展,比如:添加自定义的方法到IronPython环境。

1. 先看运行效果

我在DLConsole中输入如下的脚本:

TextBox1.Text=str(Sum(10,25))

运行结果如图:

AddMethodIntoPython.PNG

2. 向DLConsole中注册Delegate

之前,已经可以将一个对象注册到ScriptScope中,并且通过它的名字访问这个对象。大多数现代的语言中,都已经能够将方法作为对象传递。.NET是通过Delegate对方法进行的封装和传递的。DLR中也对Delegate提供了很好的支持。因此,我们不需要对DLConsole进行任何修改,就可以完成这个工作。下面的代码是测试工程的代码。

1

None.gifnamespaceTestDynamicLanguageConsole2ExpandedBlockStart.gif

ContractedBlock.gifdot.gif{3InBlock.gifpublicpartialclassForm1 : Form4ExpandedSubBlockStart.gif

ContractedSubBlock.gifdot.gif{5InBlock.gifpublicForm1()6ExpandedSubBlockStart.gif

ContractedSubBlock.gifdot.gif{7InBlock.gif InitializeComponent();8InBlock.gif9InBlock.gifthis._dlConsole.Registor(this.button1,"Button1");10InBlock.gifthis._dlConsole.Registor(this.textBox1,"TextBox1");11InBlock.gifthis._dlConsole.Registor(newSumDelegate(Sum),"Sum");12ExpandedSubBlockEnd.gif }13InBlock.gif14InBlock.gifpublicdelegateintSumDelegate(intx,inty);15InBlock.gifpublicintSum(intx,inty)16ExpandedSubBlockStart.gif

ContractedSubBlock.gifdot.gif{17InBlock.gifreturnx+y;18ExpandedSubBlockEnd.gif }19ExpandedSubBlockEnd.gif }20ExpandedBlockEnd.gif}

在代码的第11行,我们将一个方法注册到DLConsole中,命名为"Sum"。就实现了上面展示的功能。

至此,我们已经可以通过向ScriptScope中注册Delegate的方式,使Python脚本使用我们自定义的方法。但是,你会发现这样的实现方式虽然简便快捷,却无法实现函数的重载。也就是说,你不能针对不同的数据类型注册多个Sum方法。

在下一节《使用Module扩展IronPython》中,我们将建立一个自定义模块,在其中,我们可以实现函数的重载。(2008-08-16更新:通过实验,发现我所设想的路线是错误的。您可以继续关注下一篇《使CLR对象对动态语言更友好(一)》。我将实现一个CLR对象,可以支持最基本的动态语言特性——运行时添加删除属性。)敬请关注

icon_sub_c1s16_d.gif

wink_smile.gif

大家可以从这里下载可运行的源代码。

免责声明:本系列文章,完全是我个人研读IronPython源代码后找到的实现方案,并未详细的研究过IronPython的相关官方文档。因此,并不保证符合微软DLR和IronPython的设计思路,亦不能保证 在DLR和IronPython 2.0正式发布后能够继续使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值