38.6. 闭包

如果说函数是Lambda表达式的一种语法糖的话,那么闭包就是Lambda表达式的一种运行期形态。当我们将Lambda表达式以 {} 括起来,并将其作为实参(运行期)传递时,此时的Lambda表达式,我们一般称之为闭包。如下例中的第二行语句 {x,y=>x+y} 便被认为是一个闭包:

> define exec(f, x, y) {f(x,y)}
> exec({x,y=>x+y},1,2)
3

此外,ELite又为我们提供了另外一块语法糖:当一个函数的最后一个参数是一个lambda表达式时,可以采用一种非常简略的写法,将lambda表达式直接写在函数其他参数之后。

> //定义一个函数sum
> define sum(x,y){x+y;}
> //定义另一个函数exec,并且,其最后一个参数是一个lambda表达式
> define exec(x,y,f){f(x,y);}
> //将sum函数作为参数,调用exec函数
> exec(1,2,sum);
3
> //在调用exec时,可以直接传递一个Lambda表达式,并且在函数体内定义此表达式
> exec(1,2){\
2)  x,y=>x*y;\
3) }
2
>