【问题标题】:Did Scheme have macros prior to R4RS?Scheme 在 R4RS 之前有宏吗?
【发布时间】:2025-12-10 02:55:01
【问题描述】:

我对Scheme宏历史的理解如下:

  • R4RS 在附录中引入了宏。这是对语言的扩展,而不是标准的一部分。它本质上是一个出现在 R4RS 文档中的库。
  • R5RS 使用与 R4RS 类似的系统,但它完全是标准的一部分,而不是扩展。
  • R6RS 和 R7RS(小型)进行了微小的升级/更改,但没有实质性的变化。
  • R4RS 之前的任何方案都没有任何宏,除了边缘外部库。

这是正确的吗?当我搜索 R4RS 和之后的任何内容时,这似乎通常是正确的,但我很难找到一个易于搜索的 R3RS 副本。

【问题讨论】:

  • 方案中的宏是一个非常困难的话题。另一方面,您的问题并非针对特定问题。
  • @alinsoar -- 这个问题对我来说似乎很具体:“Scheme 在 R4RS 之前有宏吗?

标签: macros scheme


【解决方案1】:

方案实现从一开始就有宏,但第一个真正的标准是 R2RS,它在规范中没有包含宏系统。

最初的 SCHEME 论文“SCHEME: An Interpreter for Extended Lambda Calculus”(AIM-349, 1975),也称为 R0RS,展示了一个用 MacLISP 编写的 SCHEME 解释器。即使是对 SCHEME 解释器的早期描述也讨论了宏:

...SCHEME 有一类称为AMACROS 的原语。这些类似于 MacLISP MACROs,因为它们在执行之前被扩展为等效代码。

该部分继续描述 SCHEME 解释器提供的一些 AMACROS,包括 CONDANDORBLOCKDO

在论文的最后,展示了一个 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 撰写的一篇相当长的论文,描述了卫生宏的发展历史。

【讨论】:

  • 我很困惑。您似乎在说 R2RS 和 R3RS 没有宏作为标准,但 R0RS 和 R1RS 有。对吗?
  • 有点。 R0RS 和 R1RS 并不是真正的标准;它们是对麻省理工学院计划实施的早期持续发展的描述。其他人基于这些论文实现了 Scheme 的版本,当需要标准时,R2RS 就是那个标准。 R0RS 和 R1RS 中描述的 实现 确实有宏,据我所知,所有其他实现也有。但是,宏系统并未包含在 R2RS 或 R3RS 中,因为对于如何设计它们没有达成共识。
  • IIRC,R4RS 对宏系统仍有疑问,所以宏留给附录。
  • Here is a link to a searchable pdf of R3RS。我曾经读过一篇论文,讨论了 Scheme 中卫生宏系统的早期开发。我不确定,但我认为它是由 Daniel Friedman 或 Mitchell Wand 写的;如果我能找到一个链接,我也会添加它。
  • @Sylwester -- 我一直在努力理解你批评的根源,我做了一些修改,希望能把事情收紧一点。