动态作用域

好像刚弄明白动态作用域是怎么回事,拿个例子:

var a=0; //global
def f1():
    a=1
def f2():
    var a; //local
    f1()
 
f2()
puts a

若是静态作用域,f2调用f1,f1修改全局变量a的值为1,输出1。这个多自然…
可是动态作用域就…输出0,全局变量a的值没有变化。

f2不是调用了f1么,f1不是改变a的值么…是啊,f2调用的那个f1改变的是f2那个局部变量a的值。也就是说,同一个函数在不同的环境下调用会有不同的行为。

好吧我正在纳闷为什么会有这种东西存在过…囧

18 Responses to “动态作用域”


  • 那个puts都是在外面的,不可能得到f2里面那个local的a的啦……
    如果在f1里面加上global a,就不同了吧

    猛然想起……这是ruby还是python来着 --

    回复回复
  • 估计是调用f1的时候,才解释符号,于是解释到f2本地那个去了,按照函数压栈的顺序来的吧(是么是么……编译学得不好瞎猜…

    回复回复
  • 囧,李氏伪码?

    回复回复
  • 好像早期的lisp就是这样,囧

    好像是函数的运行环境是继承自调用者的环境,而不是继承自母函数?

    回复回复
  • 这个你试试看ANTLR的语法规则的嵌入语法动作……虽说一般编程语言里静态作用域比动态作用域易懂且易用得多,但在ANTLR那种场景里,很可能你需要的变量是从“上面”带下来然后又要从下面带上去的。有动态作用域可以少写几个字符 XDD

    另外要看动态作用域的实例还可以看Perl嘛 不用my而用local来造变量的话……

    回复回复
  • 哈哈,找Antlr的文档看下先 ^ ^

    回复回复
  • 还有一个deep binding和shallow binding不晓得你晓不晓得,我最先以为是static scope和dynamic scope的代名词,后来发现两两组合可以有四种情况 = =
    这种话题看Programming Language Pragmatics最好~

    回复回复
  • 额~ 都看不懂的~
    今天老师不在 我看电影~ 哦也!

    回复回复
  • 皮肤换得挺勤快。。。

    回复回复
  • 你可以把动态作用域看成某种意义上的全局变量。比如Common Lisp中的special variable,和Haskell扩展中的implicit parameter。

    现在主流语言中还用动态作用域的大概就是Emacs Lisp了吧,因为动态作用域比较适合存储配置信息,还有就是Emacs实在是太古董了,那时候dynamic scoping vs. static scoping还没有定论。

    回复回复
  • 正看了这书,程序语言的代码大全! =v=
    deep binding和shallow binding好像作用域的实现方法?还没大看明白好像…

    回复回复
  • 哈哈,回来了~(昨天宿舍停电了囧~)

    回复回复
  • 哈哈是啊~

    回复回复
  • 了解了,多谢指点 :)
    好像不论静态作用域还是动态作用域,最纠结的都是“既不是局部也不是全局”的变量呢…

    回复回复
  • 这个东东貌似很多语言都有。比如.net里面就有。

    回复回复
  • 呵呵~ 还以为你不要教我了呢~ 昨天开会了 好有压力的!

    回复回复
  • 我们这里开会就容易吓唬人,哈哈~~不压力部压力~~

    回复回复
  • 囧,好郁闷的特性~

    回复回复

Leave a Reply