`
RednaxelaFX
  • 浏览: 3052951 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

用Iron-*语言来探索.NET

    博客分类:
  • DLR
阅读更多
刚才写代码的时候又是在不停查文档,甚是心烦。一怒,拿出IronPython,类似这样:
IronPython 2.6 Beta DEBUG (2.6.0.1) on .NET 2.0.50727.3082
Type "help", "copyright", "credits" or "license" for more information.
>>> import clr
>>> clr.AddReference('System')
>>> import System
>>> System
<module 'System' (CLS module, 2 assemblies loaded)>
>>> R = System.Text.RegularExpressions.Regex
>>> r = R('abc')
>>> s = '123abcd456'
>>> dir(r)
['CacheSize', 'CompileToAssembly', 'Equals', 'Escape', 'GetGroupNames', 'GetGroupNumbers', 'GetHashCode', 'GetObjectData', 'GetType', 'GroupNameFromNumber', 'GroupNumberFromName', 'InitializeReferences', 'IsMatch', 'Match', 'Matches', 'MemberwiseClone', 'Options', 'ReferenceEquals', 'Replace', 'RightToLeft', 'Split', 'ToString', 'Unescape', 'UseOptionC', 'UseOptionR', '__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__subclasshook__', 'capnames', 'caps', 'capsize', 'capslist', 'factory', 'pattern', 'roptions']
>>> m = r.Match(s)
>>> dir(m)
['Captures', 'Empty', 'Equals', 'GetHashCode', 'GetType', 'Groups', 'Index', 'Length', 'MemberwiseClone', 'NextMatch', 'ReferenceEquals', 'Result', 'Success', 'Synchronized', 'ToString', 'Value', '__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__subclasshook__']
>>> m.Success
True
>>> m.Index
3
>>> m.ToString()
'abc'
>>>

我可不想为了印证记忆中对.NET的正则表达式的模糊印象而去写C#代码->编译->运行->发现错误->修改->再编译->……这种时候用IronPython正顺手。

使用IronPython时,打开.NET大门的方法就是神奇的import clr。接下来通过clr对象来添加.NET程序集的引用,就可以开始用.NET的类库了(mscorlib是默认引入的)。整个使用体验相当流畅,刚启动解释器的时候比较卡的时间也减少了(虽然还是比CPython刚启动时慢,没办法)。

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

我这IronPython是从CodePlexDLR项目编译出来的,同一个Debug目录下还有IronRuby 0.4.0.0,于是干脆用IronRuby也试一次:
IronRuby 0.4.0.0 on .NET 2.0.50727.3082
Copyright (c) Microsoft Corporation. All rights reserved.

>>> require 'mscorlib'
=> true
>>> System::Text::RegularExpressions
=> System::Text::RegularExpressions
>>> R = System::Text::RegularExpressions::Regex
=> System::Text::RegularExpressions::Regex
>>> r = R.new 'abc'
=> abc
>>> s = '123abcd456'
=> "123abcd456"
>>> r.methods.sort
=> ["==", "===", "=~", "__id__", "__send__", "class", "clone", "display", "dup", "eql?", "equal?", "extend", "freeze", "frozen?", "hash", "id", "inspect", "instance_eval", "instance_of?", "instance_variable_defined?", "instance_variable_get", "instance_variable_set", "instance_variables", "is_a?", "kind_of?", "method", "methods", "nil?", "object_id", "private_methods", "protected_methods", "public_methods", "respond_to?", "send", "singleton_methods", "taint", "tainted?", "to_a", "to_s", "type", "untaint"]
>>> r.class
=> System::Text::RegularExpressions::Regex
>>> m = r.match s
=> abc
>>> m.class
=> System::Text::RegularExpressions::Match
>>> m.methods.sort
=> ["==", "===", "=~", "__id__", "__send__", "class", "clone", "display", "dup", "eql?", "equal?", "extend", "freeze", "frozen?", "hash", "id", "inspect", "instance_eval", "instance_of?", "instance_variable_defined?", "instance_variable_get", "instance_variable_set", "instance_variables", "is_a?", "kind_of?", "method", "methods", "nil?", "object_id", "private_methods", "protected_methods", "public_methods", "respond_to?", "send", "singleton_methods", "taint", "tainted?", "to_a", "to_s", "type", "untaint"]
>>> m.index
=> 3
>>> m.length
=> 3
>>> m.success
=> true
>>> m.to_s
=> "abc"
>>>

Well……看来不太对劲。虽然程序集也正确引入了,类型和方法也都正确加载执行了,但methods返回的方法列表里没有.NET的方法。这真够郁闷的,以前的版本明明可以的啊。好一段时间没玩IronRuby,这.NET interop怎么好像退化了 OTL

Anyway。使用IronRuby时,打开.NET大门的神奇方法是require 'mscorlib'。然后可以用强名称来引入别的.NET程序集,而标准库里的一些程序集是默认引入的,例如System.dll,所以上面我没有显式引入这个程序集。然后.NET命名空间要跟随Ruby代码习惯用::来分隔,基本上没别的大问题了。需要使用.NET的可变长度参数的方法时,可以对Ruby数组调用to_clr_array方法,跟JRuby非常类似。

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

就目前而言,IronPython的完成度远在IronRuby之上。如果你也想现在就用Iron-*语言来探索.NET的话,我会推荐IronPython。不过IronPython 2.6现在还是暂时别用,bug多多……过不久等2.6出正式版之后再用吧~现在用IronPython 2.0.1稳定。
至于一个不是出自微软的Iron-*语言,IronScheme,它使用的DLR是非常老的版本,性能肯定是比不过微软的两个Iron-*语言。不过就其对R6RS的实现来说,它还是值得一试的,毕竟“实现了什么语义”比起“如何实现”更值得一般程序员所关注。
分享到:
评论
1 楼 ray_linn 2009-05-16  
用 mono shell如何,可以用来跑linq

相关推荐

    Professional IronPython.pdf

    - **第15章:从其他.NET语言使用IronPython** 讨论如何在其他.NET语言中调用IronPython代码,实现语言间的互操作性。 - **第16章:使用C#扩展IronPython** 展示如何使用C#语言为IronPython添加新的功能或性能...

    Harris -- Pro IronPython -- 2009.pdf

    对于希望利用IronPython来提升开发效率、探索新的编程方式的开发者来说,《Pro IronPython》是一本不可多得的指南书籍。 #### 技术细节: - **页数**:全书共312页。 - **内容覆盖范围**:书中涵盖了IronPython的...

    Silverlight入门教程

    - 支持多种编程语言:如Visual Basic, Visual C#, IronRuby, IronPython等。 - 支持多种通信协议:如JSON、WebService、WCF等。 - 提供强大的多媒体支持。 - **开发环境搭建**: - 安装.NET Framework及...

    Pro ASP.NET 4 CMS: Advanced Techniques for C# Developers Using the .NET 4 Framework

    - **IronPython**:探索IronPython在.NET环境中的集成方式及其实用价值。 ##### 6\. Ajax技术的应用 - **基本概念**:介绍Ajax技术的原理及其在Web开发中的作用。 - **实战案例**:通过具体实例演示如何利用Ajax...

    MSDN+C#+4.0编程指南

    - **动态类型**:C# 4.0引入了`dynamic`关键字,允许在运行时进行类型绑定,极大地简化了与非.NET库如JavaScript或IronPython的交互。 - **多目标参数**:C# 4.0支持可选参数和命名参数,使函数调用更加灵活,减少...

    Python在物联网中的应用与发展综述.pdf

    ### Python在物联网中的应用与发展综述 #### 一、物联网概览 ...无论是对于初学者还是专业开发者来说,Python都是一个值得深入探索的技术方向。随着物联网技术的不断创新和发展,Python也将迎来更多的发展机遇。

    经典Python面试题之Python基础篇.docx

    - **IronPython**: 运行于 .NET 平台的 Python 解释器。 - **PyPy**: 基于 JIT 技术的 Python 解释器,提高了执行效率。 #### 6. 位和字节的关系? - **位**: 计算机中最小的数据单位,只有 0 或 1 两种状态。 - *...

    Python入门安装和基础语法HM-AI

    - **IronPython**:运行在.NET平台上的Python解释器。 **安装Python解析器**: 1. **下载**:访问Python官方网站 (https://www.python.org/) 下载最新稳定版本(如Python 3.7)的安装包。 2. **安装**:选择自定义...

    初识Python1.docx

    - **IronPython**:使Python能在.NET平台上运行。 #### 第一个Python程序 1. **打开终端**:可以通过快捷键`Win+R`打开命令提示符或终端。 2. **启动Python**:在命令行中输入`python`或`python3`,按回车键,即可...

    SilverLight基础教程

    - **Silverlight 2 Beta 1** 的发布带来了许多新特性,比如对多种编程语言的支持(包括Visual Basic、Visual C#、IronRuby和IronPython),以及对JSON、WebService、WCF和Sockets的支持。 #### 二、搭建开发环境与...

    经典python面试题

    - **IronPython**:在.NET平台上运行的Python解释器。 #### 6. 位和字节的关系? - **位**:计算机中最小的数据单位,只能表示0或1。 - **字节**:由8位组成的基本存储单位。 #### 7. b、B、KB、MB、GB的关系? ...

    meteor-bakrommet.net:Bakrommet.net,使用 Meteor.js 构建

    2. **全栈开发**:Meteor.js允许开发者使用同一种语言(JavaScript)进行前后端开发,降低了开发复杂性,提高了开发效率。 3. **Blaze模板引擎**:Meteor内置Blaze模板引擎,可以方便地实现视图层与数据层的绑定,...

    emgu人脸识别

    1. **Emgu CV**: Emgu CV是OpenCV的.NET版本,它允许.NET开发者使用C#、VB.NET或IronPython等语言来编写计算机视觉程序。Emgu CV提供了一个全面的API,包括图像处理、特征检测、模式识别等功能。 2. **人脸识别**: ...

    IronPython 1.0

    IronPython 1.0 是一个重要的开源项目,它将Python编程语言与.NET Framework相结合,让开发者可以在.NET平台上使用Python进行开发。这个版本的发布对于Python社区和.NET开发者来说都具有里程碑式的意义,因为它打破...

    Python常用编译器原理及特点解析

    而对于需要与Java或.NET生态紧密集成的应用,则可以考虑使用Jython或IronPython。无论选择哪种解释器,理解它们的工作原理都将帮助开发者更好地利用Python的强大功能。希望本文能够为读者提供有益的信息,并激发更多...

    IronPython-2.7.4(内附样例程序)

    标签中的"IronPython"指的是这个.NET版本的Python实现,"Python"是脚本语言,"VS2010"表明这是在Visual Studio 2010环境下使用的工具。 压缩包内的文件可能包括了IronPython的库文件、文档、示例代码以及其他必要的...

    IronPython简单程序源码

    IronPython是一种基于Python编程语言的开源实现,它允许开发者在.NET Framework上运行Python代码,并能够无缝集成到.NET环境中。这个“IronPython简单程序源码”很可能是为了展示如何在Visual Studio 2008中使用Iron...

    Silverlight 2.0 Demo

    这使得.NET开发者能轻松上手,同时也支持动态语言运行时(DLR),便于使用IronPython和IronRuby等语言。 3. **数据绑定和MVVM模式**:数据绑定是Silverlight中的关键特性,它简化了UI与后台数据的交互。Model-View-...

    Pro.C#.5.0.and.the..NET.4.5.Framework,.Andrew.Troelsen

    动态语言运行时(Dynamic Language Runtime,DLR)是.NET框架的一个重要组件,它支持动态语言如IronPython和IronRuby在.NET平台上运行。通过学习这一部分,读者将了解如何利用DLR与现有C#代码进行交互,并探索动态...

    .net Framework4.0

    2. Dynamic Language Runtime (DLR):DLR是.NET Framework 4.0对动态编程语言的支持,如IronPython和IronRuby等,使得动态语言在.NET平台上运行更加顺畅。 3. Entity Framework:这个版本的Entity Framework进一步...

Global site tag (gtag.js) - Google Analytics