第19页
- 页码:第19页
1.6.5 小节给的例子是错误的,以下是作者给出的“动态作用域”代码:
#define a (x+1) int x = 2; void b() { int x = 1; printf("%d\n", a); } void c() { printf("%d\n", a); } void main() { b(); c(); }首先,用 C 语言来表示动态作用域,这一开始就错了:C 只有静态作用域,没有动态作用域。 其次,更离谱的是,作者似乎认为 C 语言的宏(#define)是一种动态手段:
之后对程序的运行分析过程的两段话也延续了这个错误。 实际上,源码在输入编译器之前,预编译器就会将源码中的所有宏替换掉,这时,源码就变成这样:
int x = 2; void b() { int x = 1; printf("%d\n", (x+1)); } void c() { printf("%d\n", (x+1)); } void main() { b(); c(); }这样的 C 源码在编译期怎么就不能被静态解释了呢?开玩笑。 最后,我来提供一个用 Clojure 写的动态作用域例子好了:
; 定义变量,并打开变量的动态作用域选项(默认使用静态作用域) (def ^:dynamic x 123) (defn show_x [] (println x) ) (defn static_x [] (show_x) ) (defn dynamic_x [] ; 用动态绑定覆盖原来的绑定 (binding [x 10086] (show_x) ) ) (println x) ;=> 123 (static_x) ;=> 123 (dynamic_x) ;=> 10086
514人阅读
huangz对本书的所有笔记 · · · · · ·
-
第19页
-
第75页
勘误: 3-6 的图,里面『L 的正闭包』的定义是错误的,符号应该是 L^+ 而不是 L^* 。 附上书...
> 查看全部2篇
说明 · · · · · ·
表示其中内容是对原文的摘抄