随笔- 33  文章- 0  评论- 339 
昨天忙了一个晚上,终于发布了新的BETA 1.5。叫BETA 1.5而不是BETA2的原因是我觉得这次发布比较仓卒,品质恐怕还到不了叫BETA2的程度。但是这次更新带来的新特性还是比较多的。下载页面:
http://sourceforge.net/project/showfiles.php?group_id=148613

首先给不熟悉VBF的人简单介绍一下VBF:VBF是一个.NET下的函数式编程类库,提供了创建函数式算法逻辑的基本框架,还提供了一个使用组合子和高阶函数来创建新函数的体系。使用VBF可以实现对象查询、词法解析以及延迟执行逻辑的许多程序。这个版本提供的新功能主要包括:

1、Nullable的支持和IsNull判定

这次提供了对.NET Framework 2.0中Nullable Type的支持,即支持返回Nullalbe<T>类型的函数子(Functor)使用定义在T上的四则运算或比较运算符。对C#而言,这是一个非常方便的特性。比如我们有个一System.Collections.Generic.List<int?>类型的列表list1,下面的代码演示了如何从中查询到所有小于0或者为空的项:
//C#
//定义一个Identity对象用于查询
Identity<int?> IdNInt = new Identity<int?>();

List
<int?> result = list1.FindAll(IdNInt.IsNull() || IdNInt < 0);

如你所见,现在可以使用捷径运算符||和&&了,这也是本版本一个新增功能。另一个新增功能:IsNull()返回一个函数用于判断当前项是否为空。

2、元组(Tuple)和多元函数支持

现在VBF通过对Tuple的支持,提供了处理二元函数及三元函数的能力。Tuple是一种只读结构体,其每个字段的类型均由类型参数指定。因此使用Tuple,你可以快速创建出满足你要求的小型结构。
'VB
'
演示生成一个Tuple

Dim t1 As Tuple(Of IntegerString= Values(12"Hello World")
Dim t2 As Tuple(Of LongSingleDate= _
    Values(100L, 
-58.8, Now())


Values函数自动生成一个相应类型的Tuple,当前Tuple最多支持5个类型参数。Tuple用于模拟多元函数的参数表,还可以作为查询的临时返回量。

3、属性访问语法

这是本版本极其重要的一个功能,有了他,就可以在Id型查询中访问被查询对象的属性。我们先看一个例子。假设Employee类型有两个属性——整数型的Age和字符串型的Name。如果我们有一个System.Collections.Generic.List<Employee>类型的列表emplist,现在要找到所有Age大于25的Employee对象,该如何写呢?VBF提供了独特的!语法(仅支持VB)和Satisfies满足条件方法:

'VB
'
Employee是一个有Age和Name属性的类型
'
emplist是一个装有Employee实例的List(Of Employee)

'定义Identity对象用于查询
Dim IdEmp As New Identity(Of Employee)

result 
= emplist.FindAll(IdEmp!Age.Satisfies(IdInt > 25))

注意!Age语法,它提供了对Age的访问,但无法得知Age的类型。因此需要在Satisfies函数后面用强类型的IdInt指明要查询的Age是Integer类型。这条查询语句可以读作“寻找Employee,它的Age属性满足整数大于25”。这已经是我找到的最具可读性的写法。除了Satisfies满足条件方法,还支持直接取得属性值的功能。比如我们要的到另一个List(Of String),是刚才那个Employee集合中所有项目Name属性组成的集合,可以这样写:
'VB
'
接上段代码

Dim names As List(Of String= _
    emplist.ConvertAll(Of 
String)(IdEmp!Name.AsType(Of String))

AsType方法表明了你要访问的属性的真实类型,这里不支持任何协变。比如上述语法如果你是用Of Object就会运行错误。C#不支持!运算符,我在C#中采用了indexer的语法,即使用方括号来访问想要的属性:
//C#
Identity<Employee> IdEmp = new Identity<Employee>();

result 
= emplist.FindAll(IdEmp["Age"].Satisfies(Identities.IdInt > 25));

4、延迟执行

现在VBF的每一个函数子对象(Functor)都支持一个DelayInoke的函数,它能返回一个IDelayInvoke(Of TReturn)的接口。使用DelayInvoke可以延迟函数的真实求值过程,直到真正使用函数返回值的时候才开始计算。延迟执行可以用来实现Command模式以及Undo/Redo功能。

VBF 1.5还提供了许多其它的新功能,比如用于String型函数的IndexOf方法支持、一元正负运算符支持、类型转换函数支持等等。有兴趣的可以直接下载源代码观看。很抱歉的是这次时间仍然较紧张,我还是没有提供文档,如果发现很难看懂我建议从Functor(Of TArg, TReturn)这个类的虚函数开始看起。希望大家多多提出建议,以便在VBF中提供更多新酷功能。
 posted on 2006-02-24 09:40 装配脑袋 阅读(1547) 评论(6)  编辑 收藏 网摘

#1楼     回复  引用  查看    
 马维峰       | 2006-02-24 18:00
有机会一定试试,记得过年时看Anders Hejlsberg在http://channel9.msdn.com/Shows/Behind_The_Code上采访的录像,说道程序语言的趋势,认为函数编程是一个非常重要的方向...
C#也在不断吸收类似的思想。
#2楼     回复  引用  查看    
 81       | 2006-02-27 09:32
老大,感觉是曲高和寡呀!
#3楼     回复  引用    
 春 [未注册用户] | 2006-03-21 22:52
为什么这么好的东西关注的人这么小?不会是因为VB的吧
#4楼     回复  引用    
 Wisli [未注册用户] | 2006-04-14 12:46
支持你
#5楼     回复  引用    
 央视评论员 [未注册用户] | 2006-08-08 20:48

因为跟双鱼座兄的讨论,顺便发现了你的框架,真的很不错。

建议就别叫VBF吧,让人以为只能用于VB,那样太可惜了。

你也可以参照这个 OQL 一下,大家互相学习:

http://www.macrobject.com/cn/nobject/index.htm
http://www.macrobject.com/cn/oql.net/index.htm
#6楼     回复  引用    
 Bash.S [未注册用户] | 2008-03-28 06:57
今天才看到这么好的东西,真是可惜,可惜老大也不更新这里了




标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接: