Макросы чтения: для чего Вы используете их? [закрытый]

18
задан Rainer Joswig 23 October 2016 в 10:49
поделиться

5 ответов

S-выражения - это синтаксис Лиспа для данных Лиспа. S-выражения читаются с помощью функции READ, а макросы чтения - это встроенный в Lisp способ расширения читателя. Это означает, что наиболее прямое использование макросов чтения - это реализация предопределенного синтаксиса данных и открытие возможностей для изменения или расширения способа чтения s-выражений в Lisp.

Lisp поставляется с предопределенным внешним синтаксисом для многих типов данных: символы, числа, строки, массивы, символы, конусы, списки, структуры и многое другое. Он позволяет печатать и считывать объекты данных.

  1. В Лиспе отсутствует синтаксис для некоторых других типов данных - особенно для хэш-таблиц и объектов CLOS. Таким образом, первое использование макросов чтения в пользовательском коде будет заключаться в расширении читателя, чтобы он мог читать структуры данных, такие как хеш-таблицы, параллельные векторы, новые числовые типы, ... в основном каждый тип данных, который разработчик хочет иметь внешний синтаксис, который может быть прочитан обратно.

  2. Поскольку Lisp использует s-выражения также для кода, второе использование макросов чтения - расширение нотации для программ Lisp. Типичный пример - использование [и] для написания встроенного кода SQL. Обычный синтаксис Лиспа похож, но использование [и] помогает выражениям SQL выделяться в коде. Другой пример - использование макросов чтения для предоставления идентификаторов для встроенных языков программирования, таких как константы Objective C, сообщения и т. Д. Clozure CL использует это для представления идентификаторов с учетом регистра / с сохранением регистра и для поиска их определения во время чтения с использованием индекса идентификаторы, доступные извне.

  3. Третье применение - встраивание различных синтаксисов в синтаксис Лиспа. Старым примером этого является макрос чтения инфиксов, который позволяет встроить инфиксные выражения. Другими примерами являются встроенный синтаксис HTML или XML или встроенные фрагменты синтаксиса других языков программирования.

  4. Иногда макросы чтения используются для реализации других (связанных) языков, которые используют синтаксис s-выражений, отличный от предварительно определенного синтаксиса Common Lisp . Примером может служить программа для чтения s-выражений Scheme, которые немного отличаются от Common Lisp.

20
ответ дан 30 November 2019 в 07:28
поделиться

Макросы чтения используются, когда есть синтаксис для литеральных объектов, которые вы можете захотеть иметь. Единственная проблема с ними - это плоское пространство имен для возможных синтаксисов (однако есть способы обойти это). Макросов чтения не так уж и много. Вот несколько примеров, которые мне приходят в голову:

7
ответ дан 30 November 2019 в 07:28
поделиться

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

Однако я успешно использовал нестандартные нестандартные таблицы чтения + чтение для простых задач синтаксического анализа. Самым сложным парсером, который я реализовал до сих пор с использованием настраиваемой таблицы чтения , был механизм шаблонов HTML (еще один, извините) с синтаксисом, аналогичным JSP / ASP, но использующим Common Lisp в качестве фактического языка шаблонов, поэтому у вас могут быть такие вещи, как

<% (for (title . link) in breadcrumb do %><a href="<%= link %>"><%= title %></a><% ) %>

(хотя это было сделано не только с помощью читаемых хаков,

4
ответ дан 30 November 2019 в 07:28
поделиться

Хотя я использую много макросов, я никогда не обнаруживал необходимости использовать макросы чтения, кроме случайных экспериментов. Если это поможет, то в «Let Over Lambda» вы найдете подробное обсуждение их: http://letoverlambda.com/index.cl/toc

2
ответ дан 30 November 2019 в 07:28
поделиться

Одним из наиболее распространенных и полезных альтернативных синтаксисов, которые можно встраивать с макросами чтения, является синтаксис регулярных выражений. Реализовать его совсем несложно, поскольку он просто читает строку с разными правилами экранирования, но если вы вообще часто используете регулярные выражения, это действительно может окупиться. Библиотека CL-INTERPOL , о которой упоминал dmitry-vk, обеспечивает эту функциональность, наряду с множеством других функций.

1
ответ дан 30 November 2019 в 07:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: