闭包
有下面一段代码:
(((λ(x) (λ(y) (+ x y))) 4) 5)
运行的结果是9.在第二个函数中有一个自由变量x,x的值是第一个函数的参数.即4.
若没有闭包,那么运行的结果就是错误:x未定义之类的.
如果将函数看作一个类型lamC,它有两部分组成,参数和函数体.其中参数是symbol,函数体是expression.即
[lamC (arg : symbol) (body : ExprC)]
那么闭包的类型看作做这样:
[closV (arg : symbol)
(body : ExprC)
(env : Env)]
Env即是环境.一个名与值对绑定的表.它取决于引用这个函数的外部.
上一篇博文中的例子写成下面这样就可以运行得到7了.
((λ(x) ((λ(y) (+ x y)) 4)) 3)
第二个匿名函数的外部环境中有x=4的这样的绑定.所以它在遇到自由变量x的时候.会去它的环境中查找得到x=4,所以可以正确运行了.
参考: