宏(用户自定义代码转换)的想法是啥时候出现的?

Posted

技术标签:

【中文标题】宏(用户自定义代码转换)的想法是啥时候出现的?【英文标题】:When did the idea of macros (user-defined code transformation) appear?宏(用户自定义代码转换)的想法是什么时候出现的? 【发布时间】:2011-03-05 04:23:18 【问题描述】:

我已阅读 McCarthy 1960 年关于 LISP 的论文,并没有发现任何与用户定义的宏或正常顺序评估类似的内容。我想知道宏何时首次出现在编程语言历史(以及 Lisp 历史)中:

用户定义代码转换(在解释或编译之前)的想法是什么时候首次描述的(理论上)? 第一个具有类 Lisp 宏的编程语言实现是什么(“类 Lisp”我的意思是“使用可读的图灵完备语言进行代码转换”)? (包括非 Lisps ——例如 Forth 已经很老了,但我不确定第一个 Forth 实现是否已经有“IMMEDIATE”) 其中哪一种是第一种高级编程语言(不包括汇编语言...) 第一个有宏的 Lisp 方言是什么?

谢谢!

【问题讨论】:

【参考方案1】:

我认为这个想法可以追溯到Post systems,用字符串重写(“如果你看到这个字符串,用那个字符串替换它”)。邮政系统具有图灵能力,因此可以计算任何东西(包括程序文本!)。 Emil Post 关于这些的论文的日期是 1943 年,但据说他在 1920 年代进行了最初的概念化。

The General Purpose Macro Processor 是最早被广泛使用的一种,于 60 年代初问世。

TRAC 是另一款可追溯到同一时期的早期宏处理器。 History of Computer Languages (TRAC) 说它是在 1959 年设计的。

这两个都是支持图灵的宏处理器。

SNOBOL 也是同一时期。

在 60 年代初构建了非常通用的宏处理器这一事实向我暗示,在那之前可能已经构建了专用的宏处理器来提供灵感。我很确定在此之前宏处理器已在汇编器中使用,但我没有具体证据。

我知道 COBOL 有所谓的 COPY 库,它们是宏和包含文件之间的交叉。我不知道这是什么时候引入 COBOL 的,但语言可以追溯到 1958 年。

有趣的是,LISP 宏可以被认为是树到树重写的一种特殊情况(“如果你看到一个看起来像这样的 s-表达式,用看起来像这样的 s-表达式替换它那”)。树可以很容易地建模为字符串(参见:“LISP”:),因此 LISP 宏是字符串重写的一种特殊情况。

树重写的广义案例现在是Program Transformation Systems的基础,可以对程序文本进行大量更改。

【讨论】:

谢谢——我忘记了汇编宏和 Post 系统。这非常有用——我还将编辑我的问题以包含“第一种高级语言”——目前尚不清楚它是否是 COBOL。【参考方案2】:

要了解宏是如何引入 Lisp 的,您应该查找现代 Lisp 宏的前身(或更准确地说,FEXPRs 是用户自定义宏的前身)。这些在多个地方都提到过——例如,在 McCarthy 的History of Lisp 的From LISP 1 to LISP 1.5 部分。但其实之前也有提过:在LISP I PROGRAMMER'S MANUAL(1960年)的第48页可以看到对FEXPRs和FSUBRs的描述。

顺便说一句,将 Lisp 宏与基于字符串的系统进行比较有点虚假。使用树变换器与字符串操作的优势足以使其成为一个完全不同的系统。 Lisp 宏的另一个重要方面是它们是本地 转换与全局程序转换(为此要阅读的最明显的论文是 Felleisen 的 On the Expressive Power of Programming Languages)。当然这里有一个完整的领域——从 FEXPR 到现代的、表现更好的宏,然后到 Scheme 中的卫生宏(它处理比符号解析树更丰富的表示),然后是宏和一个模块系统、语法扩展阶段等等等等。这里的东西可能已经够读几年了……

【讨论】:

【参考方案3】:

来自The Evolution of Lisp(斯蒂尔/加布里埃尔):

3.3 宏

Timothy P. Hart 于 1963 年在简短的 MIT AI 备忘录 [Hart, 1963] 中将宏引入 Lisp,

Timothy P. Hart,MACRO Definitions for LISP,1963 年 10 月

【讨论】:

第一个链接失效了。 @jcubic:我已经修复了链接

以上是关于宏(用户自定义代码转换)的想法是啥时候出现的?的主要内容,如果未能解决你的问题,请参考以下文章

函数式宏定义和自定义函数的区别是什么?

EXCEL宏如何让自定义函数返回错误代码?

正则匹配路由

Makefile 是如何工作的?其中的宏定义分别是啥意思?

c语言中#if defined是啥含义 怎么用

C语言中,宏替换与定义全局变量的区别是啥?