September 2nd, 2012

glider

остросюжетный триллер с участием макросов

Оригинальные макросы из лиспа весьма дубовые.

Пишется функция, которая принимает на вход структуру данных, соответствующую куску программы. Эта функция что-то там делает внутри и на выход выдает модифицированный кусок программы (возможно, неслабо переколбашенный). Во время компиляции компилятор дергает такие функции (ака макросы) и в итоге программа анализирует и генерирует саму себя. Все, конец, вот и все макросы.

Выше я упомянул слово "дубовые". Если что, это был комплимент минимализму идеи. Кстати, как раз минимализм и убедил Мартина одобрить добавление макросов в Скалу, поэтому это очень даже замечательно.

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

Можно, конечно, в сгенерированном коде руками давать переменным уникальные имена. Есть даже специальное название для генератора таких имен - называется gensym. А можно заюзать алгоритм, который следит за обычным и сгенерированным кодом и автоматически переименовывает переменные, если получаются пересечения. Само собой, этот алгоритм оборачивается в макрогенерирующий макрос, это ведь Спарта.

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

На самом деле все в сто раз интереснее. Иногда переименователь мешает, тогда надо его обхитрить. А чтобы это сделать, надо придумать еще более крутой алгоритм, который дает абсолютный и, к тому же, высокоуровневый контроль над скоупами. Но иногда этот контроль слишком многословен. Тогда можно написать еще один макрогенерирующий макрос, который будет генерировать генератор результирующего макроса, а можно сделать кое-что еще. Полная версия истории вот тут: http://www.schemeworkshop.org/2011/papers/Barzilay2011.pdf.

Возможно, уважаемые читатели, вас заинтриговало описание происходящего и появилось желание разобраться. Тогда могу посоветовать свеженаписанный обзор того, что я знаю про макросы: https://raw.github.com/xeno-by/candidacy-exam/master/2012-09-10-CandidacyExamPaper.pdf. Буду рад вашим вопросам и комментариям.