Коллекция отличных приложений и программ с использованием макросов
Я очень очень заинтересован в макросах и только начинаю понимать его истинную силу. Пожалуйста, помогите мне собрать некоторые замечательные примеры использования макросистем.
Пока у меня есть эти конструкции:
Шаблон соответствия:
Эндрю Райт и Брюс Дуба. Сопоставление с образцом для схемы, 1995
Отношения в духе Пролога:
Дорай Ситарам. Программирование в Schelog. http://www.ccs.neu.edu/home/dorai/schelog/schelog.html
Даниэль П. Фридман, Уильям Э. Берд и Олег Киселев. Разумный интриган. MIT Press, июль 2005 г.
Матиас Феллайзен. Транслитерирование Пролога в Схему. Технический отчет 182, Университет Индианы, 1985.
Расширяемые циклические конструкции:
Себастьян Эгнер. Стремительное понимание в Схеме: проект SRFI-42. На семинаре по схеме и функциональному программированию, стр. 13–26, сентябрь 2005 г.
Олин Шиверс. Анатомия петли: история масштабов и контроля. В Международной конференции по функциональному программированию, стр. 2–14, 2005.
Системы класса:
PLT. PLT MzLib: руководство по библиотекам. Технический отчет PLT-TR2006-4-v352, PLT Scheme Inc., 2006. http://www.plt-scheme.org/techreports/
Эли Барзилай. Лохотрон. http://www.barzilay.org/Swindle.
Компонентные системы:
Райан Калпеппер, Скотт Оуэнс и Мэтью Флэтт. Синтаксическая абстракция в интерфейсах компонентов. На Международной конференции по генеративному программированию и проектированию компонентов, страницы 373–388, 2005
Проверка контракта на программное обеспечение
Мэтью Флатт и Матиас Феллайзен. Единицы: Прикольные модули для горячих языков. На конференции ACM SIGPLAN по разработке и внедрению языков программирования, стр. 236–248, 1998.
Оскар Уодделл и Р. Кент Дибвиг. Расширение возможностей синтаксической абстракции. В Симпозиуме по принципам языков программирования, стр. 203–215, 199
Генераторы парсеров
Скотт Оуэнс, Мэтью Флэтт, Олин Шиверс и Бенджамин Макмаллан. Генераторы лексера и парсера в схеме. На семинаре по схеме и функциональному программированию, стр. 41–52, сентябрь 2004 г.
Инструменты для инженерной семантики:
Матиас Феллайзен, Роберт Брюс Финдлер и Мэттью Флэтт. Разработка семантики с помощью PLT Redex. MIT Press, август 2009 г.
Спецификации преобразований компилятора:
Дипанвита Саркар, Оскар Уодделл и Р. Кент Дибвиг. Структура нанопасс для обучения компилятора. Журнал функционального программирования,15(5):653–667, сентябрь 2005 года. Образовательная жемчужина.
Новые формы исполнения
Сервлеты с сериализуемыми продолжениями Грег Петтиджон, Джон Клементс, Джо Маршалл, Шрирам Кришнамурти и Матиас Феллайзен. Продолжения обобщенной проверки стеков. В Международной конференции по функциональному программированию, стр.216–227, 2005.
Система доказательства теорем
Себастьян Эгнер. Стремительное понимание в Схеме: проект SRFI-42. На семинаре по схемам и функциональному программированию, стр. 13–26, сентябрь 2005 г.
Расширения базового языка с типами
Сэм Тобин-Хохштадт и Матиас Феллайзен. Разработка и реализация типизированной схемы. В Симпозиуме по принципам языков программирования, стр. 395–406, 2008.
Лень
Эли Барзилай и Джон Клементс. Лень без всякой тяжелой работы: сочетание ленивых и строгих языков для обучения. В Функциональное и декларативное программирование в образовании, стр. 9–13, 2005.
Функциональная реактивность
Грегори Х. Купер и Шрирам Кришнамурти. Встраивание динамического потока данных в язык вызовов по значению. На Европейском Симпозиуме по Программированию, 2006
Ссылка:
Собрание из диссертации Райана Калпеппера
8 ответов
Culpepper & Felleisen, обогащающие макросы, ICFP 2010
Калпеппер, Тобин-Хохштадт и Феллайзен, Усовершенствованная макрология и внедрение типизированной схемы, Схема Семинар 2007
Флатт, Финдлер, Фелляйзен, Схема с классами, миксин и черты, APLAS 2006
Херман, Менье, Совершенствование статического анализа встроенных языков с помощью частичной оценки, ICFP 2004
Shivers, Carlstrom, Gasbichler & Sperber (1994 и позже) Справочное руководство по Scsh.
Имеет много хороших примеров использования макросов для встраивания мини-языков в Scheme. Познакомил меня с техникой определения макросов, которые неявно цитируют их аргументы. Посмотрите на использование форм процессов, регулярных выражений и мини-языков, похожих на awk. Scsh - моя рекомендация в качестве отправной точки для игры с макросами.
Хилсдейл и Фридман (2000). Написание макросов в стиле продолжения.
Показывает, как слабые макросы синтаксических правил можно сделать мощными, используя стиль передачи продолжения. Дает множество примеров.
Макросы Flatt, Culpepper, Darais & Findler (представленные), которые работают вместе - привязки времени компиляции, частичное расширение и контексты определения.
Предоставляет обзор и семантику для подхода к макросам в Racket/PLT Scheme. Примеров не так много, но я думаю, что в статье есть то, что вы ищете.
ReadScheme! Не забудьте проверить обширную библиографию на ReadScheme.
http://library.readscheme.org/page3.html
Один пример, который вы пропустили, - это встраивание синтаксиса SQL в Scheme. http://repository.readscheme.org/ftp/papers/sw2002/schemeunit-schemeql.pdf
Макросы также используются для написания поддержки для автоматического тестирования.
Не Схема, но несколько похожий диалект Лисп с очень широким использованием макросов: http://www.meta-alternative.net/mbase.html
Существуют макросы, реализующие различные виды сопоставления с образцом, списки, генераторы различных синтаксических анализаторов (включая реализацию PEG/Packrat), встроенный Prolog, вывод посетителей ADT (например, сбор шаблонов в Haskell), макросы расширяемого синтаксиса, система типов Хиндли-Милнера, Схемоподобные синтаксические макросы и многое другое. Части этой функциональности могут быть потенциально перенесены в Scheme, другие части требуют расширенной системы макросов с явным контекстом.
Я бы добавил в список "Стандартную библиотеку Схемы". Посмотри файл boot-9.scm
в раздаче лукавства. Многие из наиболее часто используемых форм Схемы - case
, and
и т. д. - определяются там как макросы.
Вот пример довольно удивительного использования макросов схемы для создания эффективных робототехнических систем, написанных на схеме
Посмотрите одну из моих любимых реализаций REST API: клиент Slack api, который написан не на Scheme, а на Racket.
Это не совсем точно, поскольку оно разбросано по большому количеству очень старых публикаций, большинство из которых я никогда не читал, но большие фрагменты IIRC Common Lisp Object System и Meta-Object Protocol* могут быть; являются; или изначально были построены с макросами...
* Которые составляют IMHO, безусловно, самая продвинутая система программирования ОО когда-либо видела