我看到了一个stackoverflow问题的答案(由Noah Lavine回答):Lisp如何让您重新定义语言本身?。宏不是完全重新定义语言,至少在我所知道的情况下(我实际上是个Schemer,可能错了),因为有一些限制。宏只能接受代码的单个子树,然后生成一个用于替换它的单个子树。因此,您无法编写整个程序转换的宏,尽管这很酷。阅读完这篇文章后,我想知道是否有“整个程序转换的宏”在Lisp或Scheme(或其他语言)中可用。如果没有,那么为什么?有以下几种可能:它不是有用的或者从不需要的、同样的事情可以通过其他方式实现、即使在Lisp中也无法实现它、它是可能的,但从未尝试过或从未实现过。更新:一种使用情况,例如stumpwm代码,其中有一些函数都在不同的lisp源文件中使用一个动态/全局defvar变量*screen-list*,该变量在primitives.lisp中定义,但在screen.lisp、user.lisp和window.lisp中使用。现在,我想将这些函数定义在可以访问let表单的闭包中,而不是动态/全局变量,但是不想将所有这些函数移到同一个位置(因为我不希望这些函数从它们相关的文件中消失),以便只有这些函数才能访问该变量。以上示例同样适用于label和flet,因此进一步可能使仅对需要它的人可用所需的变量和函数。请注意,除了使用第一个参数为上下文的defun_with_context宏之外,还可以通过读取器宏来实现,如Vatine和Gareth Rees所回答的那样。