昨天忙了一个晚上,终于发布了新的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或者为空的项:
VBF BETA 1.5 发布了//C#
VBF BETA 1.5 发布了
//定义一个Identity对象用于查询
VBF BETA 1.5 发布了
Identity<int?> IdNInt = new Identity<int?>();
VBF BETA 1.5 发布了
VBF BETA 1.5 发布了List
<int?> result = list1.FindAll(IdNInt.IsNull() || IdNInt < 0);

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

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

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

VBF BETA 1.5 发布了
Dim t1 As Tuple(Of IntegerString= Values(12"Hello World")
VBF BETA 1.5 发布了
Dim t2 As Tuple(Of LongSingleDate= _
VBF BETA 1.5 发布了    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满足条件方法:

VBF BETA 1.5 发布了'VB
VBF BETA 1.5 发布了'
Employee是一个有Age和Name属性的类型
VBF BETA 1.5 发布了'
emplist是一个装有Employee实例的List(Of Employee)
VBF BETA 1.5 发布了

VBF BETA 1.5 发布了
'定义Identity对象用于查询
VBF BETA 1.5 发布了
Dim IdEmp As New Identity(Of Employee)
VBF BETA 1.5 发布了
VBF BETA 1.5 发布了result 
= emplist.FindAll(IdEmp!Age.Satisfies(IdInt > 25))

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

VBF BETA 1.5 发布了
Dim names As List(Of String= _
VBF BETA 1.5 发布了    emplist.ConvertAll(Of 
String)(IdEmp!Name.AsType(Of String))

AsType方法表明了你要访问的属性的真实类型,这里不支持任何协变。比如上述语法如果你是用Of Object就会运行错误。C#不支持!运算符,我在C#中采用了indexer的语法,即使用方括号来访问想要的属性:
VBF BETA 1.5 发布了//C#
VBF BETA 1.5 发布了
Identity<Employee> IdEmp = new Identity<Employee>();
VBF BETA 1.5 发布了
VBF BETA 1.5 发布了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中提供更多新酷功能。

相关文章: