装配中的脑袋

用程序装配大脑,再用大脑装配程序
随笔 - 118, 评论 - 1214, 引用 - 11

导航

关于

如果想发较大的信件,请用Ninputer @ gmail.com

不要在我的Blog评论中张贴广告,除非同意向我付款。

标签

每月存档

最新留言

广告

 

很早就开始VBF的设计,在经历开发和调整了两个月的时间后,VBF的第一个BETA版终于和大家见面了!我是从前一阶段博客园上较为流行的动态语言讨论上获得灵感。我主要不是想写一个动态语言,而是发现很多动态语言共有的特征——不同程度地支持函数式编程(Functional Programming,FP)。这是一种显著不同于命令式编程(目前的VB,和C#均为命令式编程语言,面向过程和面向对象也是命令式编程范式的扩展)的编程范式。它讲究组合、高阶函数和延迟计算。在纯粹的FP语言(Lisp, SML)可以不使用变量,函数执行没有副作用,表达式的意义更接近数学式的意义而不是计算机的执行方式。函数式语言具有比命令式语言更高的数学抽象力,因此在描述某些算法的时候比命令式语言更佳。现在人们发现,在命令式语言中引入局部的函数式编程思想,能将两种范式的好处合二为一。VB9和C#3都将不同程度地引入函数式编程的特性。

我开发VBF主要就是希望利用Visual Basic 2005和C# 2.0自身所具有的语言抽象力将函数式编程的思想引入。我不对编译器进行改造,也不编写任何插件,只要引用我的类库,就可以实现一些非常精妙的语法。

[VB]
Dim list As List(Of Integer) = GetList() '假设用一些数填充list
Dim result As List(Of Integer)
'找到所有大于25或者小于等于17的数,存入result
result = list.FindAll(IdInt > 25 Or IdInt <=17)

[C#]
// using I = VBF.Functional.Identities
List<int> list = GetList(); //假设用一些数填充list
//找到所有大于25或者小于等于17的数,存入result
List<int> result = list.FindAll(I.IdInt > 25 | I.IdInt <= 17);

如你所见,“IdInt”就如同表达式中变量的占位符,由它生成的表达式并不求值,而是将表达式的运算规则保存下来传递给FindAll,而FindAll作为一个高阶函数将表达式作用于列表中的每一项上。这就是延迟计算。这里IdInt为“恒等组合子(Identity Combinator),是VBF初期所支持的几个组合子之一。通过组合子之间的组合就可以重用函数的功能,比如IdInt和+(对结果进行加法的组合子)和7(常函数)三者组合,就生成了对一个数加7的函数。这就是我VBF BETA1的最基本功能。我在VBF 1.0 BETA1中支持了以下特性:

Functor 函数体基类,支持大量组合运算符和延迟求值
Combinator 组合子基类
Identity和Constant组合子
Predicate 谓词
ComparisonPredicate 比较谓词(大于、小于等)
进行通用四则运算的组合子
进行字符串处理的组合子

我的VBF代码中非常频繁地使用泛型和运算符重载,大量手法均为主流类库所见不到的。我也因此获得了非常丰富的在.NET中使用泛型的经验。大家均可下载我的代码参考。项目主页:http://www.sf.net/projects/vbf

希望大家对我的VBF提出建议,同时敬请关注VBF的后续版本,有更多精彩的内容。

 

打印 | 张贴于 2005-11-11 08:48:00 | Tag:技术随笔

留言反馈

#re: 我的开源.NET函数式编程类库——VBF 1.0 BETA1发布 编辑
请问支持科学计数法表示的数据和符号表示的数据么?比如2.11e-11+a-(B*C)^d(其中a、B、C、d在以前定义了数据)轻回复到邮箱:whujyj@126.com
2006-03-14 00:22:00 | [匿名用户:whujyj]
#re: 我的开源.NET函数式编程类库——VBF 1.0 BETA1发布 编辑
最近才有空看你的VBF。
没有帮助文档。看起来很吃力。都是泛型,运算符重载。虽然我喜欢VB.NET,但也搞的我晕头转像。呵呵。希望能尽早出份文档。
2006-01-12 14:31:00 | [匿名用户:小春]
#re: 我的开源.NET函数式编程类库——VBF 1.0 BETA1发布 编辑
@Think

需要VB2005,该类库充分利用了所有VB2005重要的新增特性,所以2003是不可能编译的。下载一个免费的VB2005 Express版吧!
2005-11-21 08:02:00 | [匿名用户:Ninputer]
#re: 我的开源.NET函数式编程类库——VBF 1.0 BETA1发布 编辑
在vs2003中打不开

很想了解一下实现原理

无法读取项目文件“FunctionalSystem.vbproj”。文件“F:\Study\DotNet\FunctionalSystem\FunctionalSystem.vbproj”不是有效的项目文件。项目文件缺少“VisualStudioProject”节。
2005-11-17 17:32:00 | [匿名用户:Think]
#re: 我的开源.NET函数式编程类库——VBF 1.0 BETA1发布 编辑
支持!
2005-11-14 11:09:00 | [匿名用户:陈锐]
#re: 我的开源.NET函数式编程类库——VBF 1.0 BETA1发布 编辑
太好了!支持!
2005-11-12 18:54:00 | [匿名用户:Web Hosting Review]
#re: 我的开源.NET函数式编程类库——VBF 1.0 BETA1发布 编辑
恩,不错的泛型例子.有点像c++的stl库,不错.
2005-11-12 11:55:00 | [匿名用户:ge]
#re: 我的开源.NET函数式编程类库——VBF 1.0 BETA1发布 编辑
这回的写法好看多了,尽管看不太懂VB的语法。

我觉得
result = list.FindAll(user.name='Rick')
是应该想办法支持的,毕竟这种语法很有用。
2005-11-11 18:08:00 | [匿名用户:aawolf]
#re: 我的开源.NET函数式编程类库——VBF 1.0 BETA1发布 编辑
强!就一个字!好好学习一下!
2005-11-11 13:06:00 | [匿名用户:Colin Han]
#re: 我的开源.NET函数式编程类库——VBF 1.0 BETA1发布 编辑
而且我这一切都是强类型的,有充分的编译期于法检测。
2005-11-11 10:18:00 | [匿名用户:Ninputer]
#re: 我的开源.NET函数式编程类库——VBF 1.0 BETA1发布 编辑
Python支持是因为编译器这样写的。我没有改编译器,而是利用原本不支持这种写法的编程语言的 “语言本身的抽象能力” 实现出来的语法。这是两种概念。
2005-11-11 10:16:00 | [匿名用户:Ninputer]
#re: 我的开源.NET函数式编程类库——VBF 1.0 BETA1发布 编辑
python就支持这样复杂的
2005-11-11 10:08:00 | [匿名用户:leo]
#re: 我的开源.NET函数式编程类库——VBF 1.0 BETA1发布 编辑
@baicai

因为.运算符无法重载,所以我不好改变user.name这个表达式的意义,所以一直没能做成。我又不太希望用反射。

不过,若结合一定的代码生成器,比如帮助生成user类为继承自Functor<User, User>的Identity,再生成所有属性并令user.Name等于Functor<User, String>。这样就可以使用这种语法了。单单用类库恐怕难以实现。
2005-11-11 09:40:00 | [匿名用户:Ninputer]
#re: 我的开源.NET函数式编程类库——VBF 1.0 BETA1发布 编辑
能否实现对象集合查询
如:Dim list As List(Of user) = GetList()
Dim result As List(Of user)
result = list.FindAll(user.name='Rick')
2005-11-11 09:36:00 | [匿名用户:baicai]
#re: 我的开源.NET函数式编程类库——VBF 1.0 BETA1发布 编辑
先支持一下
2005-11-11 08:55:00 | [匿名用户:James]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode.MVC引擎 0.5.1.8