浅论函数式语言的环境,兼谈闭包
函数式语言与命令式语言的一个根本不同,就是下面这个两个数交换的例子居然是正确的:
a=1
b=2
a,b=b,a
print a ,b
输出 2 1
究其原因,是环境造成的。什么是环境呢?通俗点讲,你可以将环境看成是一个栈,栈单元的内容就是各个变量的值。可见,上述 a 和 b 赋值时的环境均是 a=1,b=2。再看一个 lisp 的例子:
设环境 r 为 r=( (X.(A B)) (Y.(C D)))
则 r((EXPR (X Y) (CONS X Y)) (CDR Y) (CAR X))
=r1 (CONS X Y)
其中 r1=( (X.(D)) (Y .A) (X .(A B)) (Y . (C D)))
可见列表求值跟上述赋值的结果是一样的,环境决定了自变量的值。
而闭包,则是打包了环境,相当于内部函数是在外层函数的环境下运行的。因此,又有人称 JavaScript 中的闭包是没有释放的资源(若释放了相关资源,调用内部函数就无法得到正确结果了)。
Tag:
python