浅论函数式语言的环境,兼谈闭包
2010-05-03 22:46
232 查看
函数式语言与命令式语言的一个根本不同,就是下面这个两个数交换的例子居然是正确的:
输出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中的闭包是没有释放的资源(若释放了相关资源,调用内部函数就无法得到正确结果了)。
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中的闭包是没有释放的资源(若释放了相关资源,调用内部函数就无法得到正确结果了)。
相关文章推荐
- 函数式语言特点之-闭包
- 【语言工具】Python闭包,装饰器,生成器,偏函数,函数式编程,lamda,map,reduce,filter
- linux下改变语言环境变量为:UTF-8
- Hadoop系列之三:函数式编程语言和MapReduce
- Android 判断当前语言环境是否是中文环境
- go是函数式编程语言吗?
- Spark组件之SparkR学习4--Eclipse下R语言环境搭建
- Android之动态设置App语言环境
- Windows R语言环境配置
- Scala IDE for Eclipse 之spark scala语言开发环境搭建------遇到问题记录
- 第1章 Java语言概述与发展环境
- 搭建Go语言开发环境-基础篇
- D语言环境搭建
- Go语言eclipse环境搭建图文教程
- Windows下Go语言的环境搭建
- windows下用eclipse+goclipse插件+gdb搭建go语言开发调试环境
- windows下用eclipse+goclipse插件+gdb搭建go语言开发调试环境
- Ubuntu Server 语言环境变量改为英文
- 《C++0x漫谈》系列之:瘦身前后——兼谈语言进化