方案实现从一开始就有宏,但第一个真正的标准是 R2RS,它在规范中没有包含宏系统。
最初的 SCHEME 论文“SCHEME: An Interpreter for Extended Lambda Calculus”(AIM-349, 1975),也称为 R0RS,展示了一个用 MacLISP 编写的 SCHEME 解释器。即使是对 SCHEME 解释器的早期描述也讨论了宏:
...SCHEME 有一类称为AMACROS 的原语。这些类似于 MacLISP MACROs,因为它们在执行之前被扩展为等效代码。
该部分继续描述 SCHEME 解释器提供的一些 AMACROS,包括 COND、AND、OR、BLOCK 和 DO。
在论文的最后,展示了一个 SCHEME 解释器的简单实现,但作者指出“SCHEME 的‘生产版本’的编码更加复杂。”实现,他们写道:
AMACROs 是相当复杂的怪物,与 SCHEME 本身实现的基本问题几乎没有关系,因此这里不再给出它们的代码。 AMACROs 的行为几乎与 MacLISP 宏完全一样。
在 R1RS,“The Revised Report on SCHEME: A Dialect of Lisp”(AIM-452, 1978)中,发现:
C.语法扩展
SCHEME 有一个语法扩展机制,它提供了一种将标识符定义为魔术的方法
词,并将功能与该词相关联。该函数接受
魔术形式作为论据,并产生一种新形式;这种新形式
然后被评估以代替原始(魔术)形式。这是
与 MacLISP 宏工具完全相同。
这些早期的宏系统是更传统的 Lisp 宏系统,类似于 Common Lisp 宏。卫生宏是在 R4RS (1991) 中作为语言扩展引入的,但直到 R5RS (1998) 才成为标准的一部分。
早期的报告 R0RS 和 R1RS 与其说是真正的语言标准,不如说是关于 MIT 正在进行的 Scheme 开发的报告。在介绍 R2RS (AIM-848, 1985) 时,作者说主要 Scheme 实现的 15 个代表召开会议以创建新标准,因为实现开始变得过于分歧。这个新标准规范中没有包含宏系统,但 R2RS 确实提到了宏,包括当时所有的主要实现都有宏系统:
方案没有任何标准工具来定义新的特殊形式。
理由: 定义新的特殊形式的能力会产生许多问题。 Scheme 的所有当前实现都具有在一定程度上解决这些问题的宏工具,但是解决方案完全不同,目前尚不清楚哪种解决方案是最好的......
R3RS (1986) 有一些类似的语言:
宏
Scheme 没有任何标准工具来定义新类型的表达式。改变语言语法的能力会产生许多问题。 Scheme 的所有当前实现都具有在一定程度上解决这些问题的宏工具,但解决方案却大不相同,目前尚不清楚哪种解决方案是最好的,或者是否有任何解决方案真正足够。我们鼓励实施继续尝试不同的解决方案,而不是标准化。
所以我会说将 R4RS 之前的宏系统描述为“边缘库”是不公平的,更公平地说,当时的 Scheme 宏系统是特定于实现的。一旦宏观卫生被确定为一个重要问题,就会在 Scheme 社区中齐心协力为卫生宏寻找最佳解决方案,但也存在相当多的分歧。这就是上述 R2RS 和 R3RS 引用中描述的情况,带有“...目前尚不清楚哪种解决方案是最好的......”
AIM-349 和 AIM-452(R0RS 和 R1RS)确实是关于麻省理工学院 Scheme 开发的报告,而 R2RS 是第一次真正尝试将不同的实现整合到一个标准下,即 R2RS 是第一个真正的标准为方案。宏存在于 AIM-349 和 AIM-452 描述的早期实现中,但宏被排除在从 R2RS 开始要求实现遵循的标准之外,直到在该主题上达成共识;每个实现都有自己的宏方法。
资源
R3RS。这是一个可搜索的 pdf 版本,质量比我在网上看到的大多数扫描结果都要好。
Hygienic Macro Technology。这是 William Clinger 和 Mitchell Wand 撰写的一篇相当长的论文,描述了卫生宏的发展历史。