- 6
- 0
- 约 9页
- 2017-07-24 发布于江苏
- 举报
第 10 章 其他的宏陷阱
第 10 章 其他的宏陷阱
编写宏需要格外⼩⼼。函数被隔离在它⾃⼰的词法世界中,但是宏就另当 论了,因
为它要被展开成进调⽤⽅的代码,所以除⾮仔细编写,否则它将会给⽤户带来意料之
外的不便。第 9 章详细说明了变量捕捉,它是这些不速之客中最常见的⼀个。本章将
讨论在编写宏时需要避免的另外四个问题。
10.1 求值的次数
[⽰例代码 10.1] 控制参数求值
正确的版本:
(defmacro for ((var start stop) body body)
(let ((gstop (gensym)))
(do ((,var ,start (1+ ,var))
(,gstop ,stop))
(( ,var ,gstop))
,@body)))
导致多重求值:
(defmacro for ((var start stop) body body)
(do ((,var ,start (1+ ,var)))
(( ,var ,stop))
,@body))
错误的求值顺序:
(defmacro for ((var start stop) body body)
(let ((gstop (gensym)))
原创力文档

文档评论(0)