宏符号如何处理阴影?

Bag*_*ers 3 macros common-lisp

CLHS

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"
Run Code Online (Sandbox Code Playgroud)

我的问题是:如何通过符号宏让阴影遮挡哪些形式?我问是因为宏不能保证尚未重新定义let或用户尚未创建另一种形式来执行与let相同的工作。这是仅查找cl:let符号的特殊“哑巴”案例吗?还是有一些更先进的技术正在进行?

如果这个问题太模糊,我很乐意编辑,我很难阐明这个问题。

Ben*_*yde 5

见3.1.1.4及周围材料。

那句话来自哪里?我不认为这是完全正确的,因为let并不是唯一可以在词汇环境中掩盖由macrolet建立的名称的事物。

我认为揭示词法环境不仅仅是一个抽象概念并没有太大的害处,而是有一个实际的数据结构来体现它。通过&environment绑定机制,可在编译时为宏提供词法环境。宏可以使用它来进入环境窗口,并且存在使用环境的协议。因此,举一个简单的例子,可以编写对词法环境中的声明敏感的宏,例如,如果将变量声明为fixnum,则以一种方式扩展。

环境的实现由实施者决定,但是嘿,它只是带有有关名称信息的名称堆栈。因此,lambda绑定,宏,标签,let *等等等只是将新名称推入该堆栈中,从而掩盖了旧名称。词汇声明被添加到有关名称的信息中。

然后,编译器或评估器使用环境(堆栈)来指导结果代码或执行的行为。值得注意的是,该数据结构不必在运行时生存下来,尽管它的某些后代确实可以帮助调试器。

因此,要回答您的问题:宏对它的主体可能正在做的形式一无所知。