Как статичные лимитирующие макросы?

Я читал статью Пола Грэма "Столетний язык".

http://www.paulgraham.com/hundred.html

Там он утверждает, что статическая типизация "исключает [s] истинные макросы".

Например, типы кажутся неисчерпаемый источник исследований несмотря на то, что статические типизация, похоже, исключает истинные макросы - без которых, на мой взгляд, нет язык стоит использовать.

Как это так? Где документы? Я пробовал поиск в Google без успеха.

Ответ 1

Статическая типизация не исключает макросов. Например, статический тип язык Boo имеет макросы. Так что Nemerle.

Тем не менее, это зависит от того, что Грэхем означает "истинные" макросы. Возможно, макросы Boo и Nemerle являются "ложными" по его стандартам.

Ответ 2

На самом деле не так, что статическая типизация исключает макросы, но, как правило, это означает, что макросистема должна быть более сложной, чем макросы макросов замены негигиеничных символов, знакомые многим. Я не совсем уверен, что Грэхэм пытается здесь, или что он подразумевает под "истинными" макросами.

См. этот документ для принятия гигиенических макросов в статически типизированном контексте.

(Кстати, я также не согласен с тем, что ни один язык не стоит использовать, если у него нет макросов. Я думаю, что первоклассные функции в сочетании с некоторыми более сложными современными типами систем могут элегантно решить большинство проблем на котором традиционно были нацелены макросы.)

Ответ 3

"статическая типизация, похоже, исключает истинные макросы" Как это так?

Без определения "истинных макросов" это бессмысленное утверждение, но у OCaml были как статические типизации, так и (АСТ-переписывающие) макросы до того, как Пол Грэхем написал это. Он мог легко обнаружить это для себя, но, по-видимому, этого не сделал. Я даже не вижу логической причины полагать, что статическая типизация исключает макросы.

Где документы?

Я ничего не знаю. Lisp -строчные макросы сегодня немодные.

Имейте в виду, что Пол Грэм является философом, который написал корзину покупок в Lisp, которая была куплена Yahoo и впоследствии переписана. Он ударил по золоту, ушел в отставку и потом много лет писал такие вещи.

Ответ 4

Статическая типизация, в которой система не выводит типы, предотвращает поистине универсальные макросы, поскольку вывод макросов должен оставаться безопасным по типу в очень ограниченном смысле.

Ответ 5

Пол Грэм является сторонником "весь язык там все время" :

Нет реального различия между временем чтения, временем компиляции и во время выполнения. Вы можете компилировать или запускать код во время чтения, чтения или запуска кода при компиляции и чтении или компиляции кода во время выполнения.

Запуск кода во время чтения позволяет пользователям перепрограммировать синтаксис Lisp; Бег код во время компиляции является основой макросов; компиляция во время выполнения основа Lisp используется в качестве языка расширения в программах, таких как Emacs; и чтение во время выполнения позволяет программам общаться с использованием s-выражения, идея, недавно изобретенная как XML.

Таким образом, он может ссылаться на практическую невозможность определения новых типов во время выполнения на языке, который ожидает, что во время компиляции будет иметь всю информацию о типе, так как Daniel Ribeiro указывает на свой блог:

Обратите внимание: вы не можете сделать метапрограммирование во время выполнения Генеральная. Например: хотя некоторые языки позволяют создавать интерфейсы, которые не существуют во время компиляции, единственный способ вызвать методы из них осуществляются с помощью небезопасных способов (таких как отражение).

Я уверен, что вам не составит труда найти программистов, которые спорят, что эта возможность стоит отказаться от преимуществ, которые они получают от статического ввода.