【发布时间】:2024-01-20 00:01:01
【问题描述】:
来自CLHS
symbol-macrolet 在词法上为每个以符号命名的符号宏建立扩展函数。
...
symbol-macrolet 的使用可以被 let 遮蔽。
这允许以下代码工作(在 *b* x 内绑定到 '1'):
CT> (with-slots (x y z) *b*
(let ((x 10))
(format nil "~a ~a ~a" x y z)))
"10 2 3"
我的问题是:symbol-macro 如何让知道哪些形式可以影响它?我问,因为宏不能保证 let 没有被重新定义,或者用户没有创建另一个表单来完成与 let 相同的工作。这是只寻找 cl:let 符号的特殊“愚蠢”案例吗?还是有一些更先进的技术在进行?
如果这个问题太模糊,我很乐意编辑这个问题,我很难清楚地表达这个问题。
【问题讨论】:
-
我确实不确定您要问什么,但请记住,
symbol-macrolet和let本身都是特殊运算符——积木的语言。它们不应该被重新定义或遮蔽,否则就会出现混乱。 -
是的,我想知道 let 的特殊性是否与如何完成有关。看了 Ben 的回答后,我了解到宏可以获取有关它们所处的词汇环境的信息,这些信息非常有趣并且可能相关......我需要阅读!
标签: macros common-lisp