44.R语言lexical scope浅谈
稍微查了下资料,我觉得lexical scope貌似与static scope是一个意思?(如果错了,希望高手纠正)它们有别于dynamic scope.下面跟着我简单熟悉下R的lexical scope(词法作用域)(资料大部分整理自网络,加上自己的理解)
首先,先上例子
n=3<br />
cube <- function(n) {<br />
sq <- function() n*n<br />
n*sq()}<br />
cube(2)
这个例子,大多数学过c/c++,java等语言的同学可以一眼看出答案,没错是8
我们再看:
h = function () {<br />
f = function () {<br />
g = function () a+b<br />
a = 10<br />
g()<br />
}<br />
a = 100<br />
b=200<br />
f()<br />
}<br />
b=3<br />
h()<br />
这个例子就比较复杂了,但要慢慢推理还是可以推出答案是210,如果我去掉b=200呢,那答案就是13,如果同学们看到这里没理解的,务必要理解,这里的概念只有函数作用域和全局作用域,可比加上一个类作用域的C++要简单多了吧..函数里面找不到就一直往外找,找到了就是,所以a=10在f里面找到,b=200没去掉,则在h里面找到,去掉则在全局找到b=3
上面的理解透了,下面就是重点了:
b=1</p>
<p>f = function ()<br />
{<br />
g = function () a+b<br />
a = 10<br />
g()<br />
}</p>
<p>h = function () {<br />
a = 100<br />
b = 200<br />
f()<br />
}<br />
h()
这个时候答案是多少??嘿嘿!答案是11.别慌!这就是lexical scope的精髓了,为什么是11而不是210呢?
词法就是程序文本,词法作用域就是根据程序文本来确定作用域,那我们的f定义在了全局作用域,编译的时候它的b的值就绑定到了b=1上面,所以运行的时候就是11,而上个例子其实本质是f定义在了h里,它的b编译的时候绑定到了b=200,大多数语言都是用这个lexical scope(或者static scope?),比如C:
<br />
#include <stdio.h><br />
int x= 5;<br />
int f(){<br />
return x;<br />
}</p>
<p>int g(){<br />
int x = 1;<br />
return f();<br />
}</p>
<p>
g()答案就是5,而如果采用动态作用域规则答案就是1(这里不讨论dynamic scope咱水平没到那个地步)
好了,更深入的理解大家可以自己搜搜去研究研究,总之它的核心就是根据程序文本,编译的时候绑定变量的值[s:11]
</p>