Изначально я предполагал, что моя утилитка dpp для препроцессинга сурсов на паскале будет строчно-ориентирована. Т.е. ключевые строки программы (объявление класса, функции, слова «interface» и «implementation») должны были бы занимать одну строку, а dpp может только дописывать в конец некоторым строкам какой-то код.
Объяснял я это тем, что от этого будет проще жить. Однако, напротив, начался адский кошмар и говнокод.
Поэтому я принял решение полностью отказаться от концепции строчно-ориентированности, ввёл новый синтаксис для dpp-макросов и начал с нуля.
А именно, код для dpp должен находится внутри блока #(…). Например, уже реализована конструкция
#(return A)
Которую dpp заменяет на
begin Result := A; Exit end
Хотя только что мне пришла в голову идея реализовать конструкцию с возможностью вставки нескольких операторов, т.е.
#(return A1 A2 … AN)
развернётся в
begin A1; A2; … A(N-1); Result := AN; Exit end
Теперь у меня серьезные проблемы с тем, что некоторые команды должны не только генерировать код прям на месте, но и добавлять какой-то код в другие части проекта. (К примеру, лямбда-функции должны добавлять свой код в implementation-секции модуля.) А это без предположения о строчном разбиении задача не минутная.
Но нет худа без добра, и возможно, что будет возможность писать макросы на лиспе, командой #(lisp …).
Комментариев нет:
Отправить комментарий