作用域
今天看书,里面讲静态作用域(词法作用域)和动态作用域。想起大概一年多以前用过一点Common Lisp,里面就可以声明动态作用域的变量。基本上就是说,遇到一个符号的时候,不是根据源代码(静态,词法,写程序时)的结构来bind,而是在运行时根据函数调用栈(动态)来bind。举个例子,你在一个函数f里引用了变量v,但是函数f里并没定义这个变量,也不存在这个全局变量,但是,调用f的函数(注意是调用f而不是定义f的函数)g定义了这个变量,那就成了,就是它。真变态。
支持这个特性的语言一定是解释执行的。因为编译的时候你根本就不知道这个变量是什么,既没有这个变量的地址,也不知道它的大小,没法分配空间。实现起来并不困难,只要顺着运行栈往调用者方向一路查去就成了。实现上的方便一般都不会带来好结果。。。动态作用域是难以理解并容易出错的,所以现在很少见了。
0 条评论: