The Way 2 Inner Peace.

静态作用域与动态作用域
得到Y组合子

闭包

Qians posted @ 2012年12月03日 19:47 in scheme with tags Scheme , 798 阅读

有下面一段代码:

(((λ(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,所以可以正确运行了.

参考:


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter