Anonymous Method, Lambda Expression & Closure
在看Boo中是如何实现这些之前,我觉得有必要澄清一下它们各自的概念。让我们来从Lambda Expression开始。
Lambda Expression
这 个概念是FP(Functional Programming)的核心概念之一。在FP中,除了函数与表达式(函数的唯一组成部分)之外,不存在任何其他的定义了。函数都可以由一个 lambda表达式来代表。实际上lambda expression说白了就是一条名为lambda的表达式(无名的表达式)。Lambda表达式在FP中应用最广。Python示例:
def mayor(a):
return lambda b: b > a
isHighWord = mayor(0x80000000)
print isHighWord(9)
以 上定义了一个大于的函数,它返回一个lambda expression,可以把这个表达式看做是一个函数,它接受一个参数b,然后与a做比较看谁更大并返回比较结果。随后我们声明了一个变量 isHighWord来代表大于0x80000000的函数。注意在Boo中是不支持Lambda表达式的,不过聪明的你可能已经注意到了,Lambda 表达式可以用Anonymous Method来代替!
Anonymous Method
匿名方法,这个我想大家应该都很熟悉了,C# 2.0的一个新feature,示例如下:
button1.Click += delegate {
MessageBox.Show("Anonymous Method");
};
Closure
这个也 是FP语言的一个特性,后来因为它的较强实用性也被许多非FP语言实现了下来。简单地说,一个Closure就是将一段代码当作参数的形式传入到一个函数 中。你会想,这和委托有什么区别呢?有一定的区别,Closure不仅可以将一段代码以参数的形式传入到另一个函数中,还可以使在它scope内所有可见 的变量在传入到的函数中也可见,也就是示例1中b > a的a的来源。
有心人你可能已经注意到了,没错,C# 2.0中的Anonymous Method不仅是一个匿名的delegate,它就是一个closure,在它视线内的变量都可以在匿名方法内看的到。现在你已经意识到了,其实用 Anonymous Method就可以实现Lambda Expression与Closure了,那么下面就让我们真正的来看看在Boo中是如何实现Anonymous Method的,以下是一个完整的可编译的示例:
namespace Cavingdeep.Sample
import System
import System.Windows.Forms
import System.Drawing
# Main form for Anonymous Method test.
class MainForm(Form):
clickMeButton as Button = Button()
def constructor():
#
# clickMeButton
#
clickMeButton.Text = "Click Me!"
clickMeButton.Location = Point(10, 10)
clickMeButton.Click += {
MessageBox.Show("I am '${clickMeButton.Text}'.");
}
# clickMeButton.Click += def ():
# MessageBox.Show("I am '${clickMeButton.Text}'.")
#
# self
#
self.Controls.Add(clickMeButton)
mainForm as Form = MainForm()
Application.Run(mainForm)
怎么样,Boo的语法还不算难懂吧?在Boo中,有两种Anonymous Method有两种定义方法,一种就是用示例中所展示的{},注意在{}中的语句要用;隔开;另一种方法是用def,就像在注释中的那样。Boo的基本语法我就不仔细讲了,与Python差不多,建议大家去Boo的官方网站上看一下。
好了,这篇就讲到这里了,想编译看看结果的朋友可以去下载Boo,然后用这段命令行编译"booc -r:system.windows.forms -t:winexe lambda.boo",另外不要忘了将Boo.Lang.dll同编译好的exe放在一起,否则是不行的哦。
参考
Closure
http://www.martinfowler.com/bliki/Closure.html
http://linuxgazette.net/109/pramode.html