所以...我是 r6rs 方案的新手,正在学习宏。谁能给我解释一下“卫生”是什么意思?
提前致谢。
卫生经常在宏的上下文中使用。卫生宏不使用可能会干扰正在扩展的代码的变量名称。这是一个例子。假设我们想要定义or
带有宏的特殊形式。直观地说,
(or a b c ... d)
会扩展到类似的东西(let ((tmp a)) (if tmp a (or b c ... d)))
。 (我省略了空的(or)
为简单起见。)
现在,如果名字tmp
实际上是在代码中添加的,就像上面草绘的扩展一样,它不卫生,而且很糟糕,因为它可能会干扰另一个同名的变量。说,我们想评估
(let ((tmp 1)) (or #f tmp))
使用我们的直觉扩展,这将变成
(let ((tmp 1)) (let ((tmp #f)) (if tmp (or tmp)))
The tmp
从宏观阴影最外层tmp
,所以结果是#f
代替1
.
现在,如果宏是卫生的(并且在Scheme中,使用时会自动出现这种情况)syntax-rules
),然后而不是使用名称tmp
对于扩展,您将使用保证不会出现在代码中其他任何位置的符号。您可以使用gensym
在 Common Lisp 中。
保罗·格雷厄姆的《论 Lisp》 http://www.paulgraham.com/onlisp.html有关于宏的高级材料。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)