龙书《编译原理》第一章中关于Dynamic Scope的例子怎样理解

这个例子确实不太好。作者的意图大概是利用C的宏的语法来演示给读者看,a的声明并不遵循静态/词法作用域的规定,而是要在每个具体的使用点(use site)去解析(resolve)其具体含义(binding)。如果a遵循词法作用域的话,那在C里a的声明就会跟 a = x + 1 一样了,这里的x会直接resolve到当前词法作用域里能看到的那个x,而不需要后面在使用a时每次重新resolve。但C的宏跟真正的动态作用域的实现机制还是差太多。毕竟预处理是C的“编译时”的一部分,C的宏在预处理时经过展开就变回普通的满足词法作用域的C代码了,所以题主才会觉得困惑吧。
■网友
个人觉得测试作用域是不是静态的 用Y组合子做各种测试真是再合适不过了...(((fn ((fn (f f)) \t\t(fn \t\t\t(m (fn ((j j) x)))))) (fn (fn \t\t(if (empty? coll) \t\t\t0 \t\t\t(+ (first coll) (f (rest coll))))))) \u0026#39;(1 2 3))或者看王垠的博客 怎样写一个解释器, 也讲了一些作用域姿势, 个人感觉作为入门选手的第三方阅读材料还不错
■网友
静态范围是取程序文本,最近定义的变量,是编译时期做的事。而动态范围取最近用到的变量的值,是运行时的动作。
■网友
现在的语言大多没有这个了吧 可以看下pascal
■网友
这个例子举得不恰当。宏能实现动态作用域要实现的作用,其实实现差远了。


    推荐阅读