很早就開始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中使用泛型的經驗。大家均可下載My Code參考。項目首頁:http://www.sf.net/projects/vbf
希望大家對我的VBF提出建議,同時敬請關注VBF的後續版本,有更多精彩的內容。