龙书《编译原理》第一章中关于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
■网友
这个例子举得不恰当。宏能实现动态作用域要实现的作用,其实实现差远了。
推荐阅读
- 怎样看待许多《编译原理》、《操作系统》教材里,没有编译器、操作系统demo(连一个模拟的,也没有)
- 编译原理:符号表中为啥要设计字符串表这样一种数据结构
- |云龙书院本周线上公益讲座预告 解读红楼边缘人物追念沛县先贤
- |云龙书院“云说两汉”系列讲座预告来啦!
- 转CS不学编译原理的影响大吗可否举例说明
- 优秀的程序员具有哪些品质怎样获取
- 怎样系统的学习C++编译语言和数据结构、算法分析、编译原理有啥关系
- 龙书中提到的“双缓冲区”在实际的编译器中有运用吗
- |云龙书院本周线上公益讲座预告
- 上过php,js之类的各种课,感觉比编译原理,操作系统,还有算法等都简单,为啥还有很多人说前端难呢
