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

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

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

Читатель не отвечает за синтаксис языка программирования Lisp - только для s-выражений.

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

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

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

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