Какие преимущества есть у обычных макросов для чтения lisp, которых нет у Clojure?

В последнее время я много использую Clojure, но я до сих пор не понимаю, какую функциональность я не получаю, которую предоставляют общие макросы для чтения lisp. Может объясните объяснить это мне в простых терминах?


person yazz.com    schedule 21.04.2011    source источник


Ответы (3)


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

Например, вы можете реализовать литералы регулярных выражений (например, #"pattern") самостоятельно, используя макросы чтения. Без них вам пришлось бы правильно экранировать регулярные выражения в строковых литералах, переданных в re-pattern.

Кстати, хотя общедоступных API-интерфейсов Clojure для изменения средства чтения нет, это не невозможно, как показано в этих сообщениях:

person cemerick    schedule 21.04.2011

Простой пример. Common Lisp имеет другой синтаксис чтения векторов #() вместо []. Но с возможностью создания пользовательских макросов чтения вы также можете иметь макрос чтения, который переводит [2 3 4 5] в вектор в Common Lisp.

Поскольку большинство пользователей не знают о значении макросов чтения, которые они создали, они редко используются, и, чтобы полностью избежать путаницы, Рич Хикки решил удалить возможность иметь определяемые пользователем макросы чтения в Clojure. Clojure, однако, имеет предопределенные макросы чтения — цитата, вектор, регулярное выражение, карта и т. д.

person Bozhidar Batsov    schedule 21.04.2011

В Common Lisp читатель расширяется пользователем с помощью макросов чтения. читатель отвечает за чтение s-выражений. S-выражения — это внешний текстовый синтаксис для типов данных Лиспа, таких как числа, строки, символы, списки, константы, структуры, массивы, символы и т. д.

Читатель не несет ответственности за синтаксис языка программирования Лисп — только за s-выражения.

Таким образом, основная цель, с точки зрения пользователя, для макросов чтения состоит в том, чтобы расширить или изменить синтаксис s-выражений. Например, пользователь может добавить текстовый синтаксис для различных классов CLOS (таких как URL-адреса, ...), хэш-таблицы, специальные идентификаторы, новые типы номеров, ...

Иногда он также используется для встраивания синтаксиса/синтаксиса других языков, которые имеют разные правила для формирования токенов: встроенный SQL, встроенный C, инфиксные выражения, встроенные вызовы Objective C, встроенные языки правил, встроенный XML, встроенный JSON и многое другое.

Другое использование — предоставить пользователю дополнительный контроль над s-выражениями, которые reader фактически читает. Например, условные выражения признаков.

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

person Rainer Joswig    schedule 22.04.2014