Как статическая типизация ограничивает макросы?

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

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

Там он утверждает, что статическая типизация «исключает настоящие макросы».

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

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


person Unknown    schedule 17.10.2009    source источник
comment
Одним из доказательств в пользу утверждения Грэма является то, что никто, кажется, не заинтересован в создании или использовании языка со статической типизацией, который идет так же далеко, как Лисп в обслуживании макросов: более или менее отказывается от синтаксиса, чтобы заставить всех думать в терминах. деревьев синтаксического анализа, которые, кстати, могут быть представлены в виде списков (фундаментальная структура данных языка). Похоже, были две несуществующих попытки сделать возможным написание кода на Haskell в формате, подобном Lisp: Liskell и Список.   -  person kuzzooroo    schedule 27.03.2014


Ответы (5)


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

Однако это зависит от того, что Грэм подразумевает под «настоящими» макросами. Возможно, макросы Boo и Nemerle "ложны" по его меркам.

person itowlson    schedule 17.10.2009

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

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

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

person Doug McClean    schedule 17.10.2009
comment
ссылка мертва. получил название бумаги? - person honeyspoon; 16.03.2021

«Кажется, статическая типизация исключает настоящие макросы». Как это верно?

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

Где бумаги?

Я не знаю ни одного. Макросы в стиле Lisp сегодня не в моде.

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

person J D    schedule 18.03.2013
comment
2019, каждый новый язык Julia, Nim, Haskell, Scala, Clojure, Elixir, Rust, D, C++ поддерживает макросы или какую-либо форму макросов... - person aoeu256; 02.10.2019
comment
@aoeu256: C++ (1985 г.), Haskell (1990 г.), D (2001 г.), Scala (2004 г.), Clojure (2007 г.) и Nim (2008 г.) всем более 10 лет. Rust (2010 г.), Elixir (2012 г.) и Julia (2012 г.) являются новыми, но Elm (2012 г.), Typescript (2012 г.), Purescript (2013 г.), Swift (2014 г.), Unison (2015 г.), Reason (2016 г.) и DarkLang (2019 г.). ) еще новее, и ни один из них не поддерживает макросы в стиле Lisp. C++ и D предоставляют только макросы в стиле C. Haskell и Scala на самом деле не поддерживают макросы: у них просто есть экспериментальные побочные проекты. - person J D; 02.10.2019

Пол Грэм выступает за то, чтобы "все языки всегда были рядом":

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

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

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

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

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

person kuzzooroo    schedule 27.03.2014
comment
Ну всегда есть unsafePerformIO.... - person aoeu256; 06.04.2021

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

person phoebus    schedule 17.10.2009