Я прочитал газету McCarthy 1960 года на LISP и не нашел ссылки ни на что, что это подобно пользовательским макросам или нормальной оценке порядка. Я задавался вопросом, когда макросы сначала появились в истории языка программирования (и также в истории Lisp):
Спасибо!
Из Эволюция Лиспа (Стил / Габриэль):
3.3 Макросы
Макросы, по-видимому, были введены в Лисп Тимоти П. Хартом в 1963 году в короткой записке MIT AI [ Hart, 1963],
Тимоти П. Харт, MACRO Definitions for LISP , октябрь 1963 г.
Думаю, идея восходит к Post systems, переписыванию с помощью строк ("если вы видите эту строку, замените ее на эту"). Пост-системы способны к Тьюрингу, и поэтому могут вычислять что угодно (включая тексты программ!). Статья Эмиля Поста о них датирована 1943 годом, но, предположительно, он разработал первоначальную концепцию в 1920-х годах.
Макропроцессор общего назначения, один из первых широко используемых, был доступен в начале 60-х годов.
TRAC - еще один ранний макропроцессор, относящийся к тому же периоду. В Истории компьютерных языков (TRAC) говорится, что он был разработан в 1959 году.
Оба они являются макропроцессорами с поддержкой Тьюринга.
СНОБОЛ также датируется тем же периодом.
Тот факт, что макропроцессоры общего назначения создавались в начале 60-х годов, намекает мне, что до этого, вероятно, были созданы макропроцессоры специального назначения, которые послужили источником вдохновения. Я почти уверен, что макропроцессоры использовались в ассемблерах до этого момента, но у меня нет конкретных доказательств.
Я знаю, что в COBOL есть так называемые COPY libs, которые представляют собой нечто среднее между макросами и включаемыми файлами. Я не знаю, когда это было введено в COBOL, но язык восходит к 1958 году.
Интересно отметить, что макросы LISP можно рассматривать как частный случай переписывания деревьев ("если вы видите s-выражение, которое выглядит так, замените его s-выражением, которое выглядит так"). Деревья могут быть легко смоделированы как строки (см.: "LISP" :) и, таким образом, макросы LISP являются частным случаем перезаписи строк.
Обобщенный случай древовидного переписывания сейчас является основой для систем преобразования программ, которые могут выполнять массивные изменения в тексте программы.
Чтобы узнать, как макросы появились в Лиспе, следует поискать упоминания о FEXPRs и FSUBRs, которые являются предшественниками современных макросов Лиспа (точнее, FEXPRs являются предшественниками макросов, определяемых пользователем). Они упоминаются в нескольких местах - например, в разделе От LISP 1 до LISP 1.5 книги Маккарти История Лиспа. Но на самом деле, это упоминается и раньше: на стр.48 LISP I PROGRAMMER'S MANUAL (от 1960 года) вы можете увидеть описание FEXPRs и FSUBRs.
BTW, сравнение макросов Лиспа со строковыми системами немного нелепо. Преимущество использования древовидного трансформатора по сравнению с манипуляциями со строками достаточно значительно, чтобы сделать его совершенно другой системой. Другим важным аспектом макросов Лиспа является то, что они являются локальным преобразованием по сравнению с глобальным преобразованием программы (наиболее очевидная статья, которую следует прочитать для этого, - On the Expressive Power of Programming Languages Феллейзена). И, конечно, здесь есть целая область - переход от FEXPR к современным, более хорошо себя ведущим макросам, затем к гигиеническим макросам в Scheme (которые имеют дело с представлением, более богатым, чем символьные деревья разбора), затем к комбинации макросов и системы модулей, фазам расширения синтаксиса, и т.д. и т.п. Здесь, вероятно, достаточно материала для нескольких лет чтения...