Какое преимущество имеют обычные макросы для читателей LISP, которых нет у Clojure? - PullRequest
14 голосов
/ 21 апреля 2011

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

Ответы [ 3 ]

10 голосов
/ 21 апреля 2011

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

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

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

9 голосов
/ 21 апреля 2011

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

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

8 голосов
/ 22 апреля 2014

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

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

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

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

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

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

...