История изменений
Исправление quasimoto, (текущая версия) :
top-level или локальные - тут не важно
Это важно, например foo-using-bar-dsl.cc, bar-using-foo-cc.dsl - если *.dsl транслируется в *.cc, то есть в top-level формы, то мы тут легко получаем интерпортабельность просто на уровне символов линковки, вся сложность только в парсере, чекере (если нужен) и принтере. Поэтому кодогенерация top-level форм «никогда не была проблемой» - cpp, m4, свои велосипеды-трансляторы.
И это ни через рефлексию ни через ADT не сделать
Ну да, это должен быть либо механизм в языке, либо ручками.
Как в TH сделать макрос, раскрывающийся в определение другого макроса?
А в чём проблема? Пишется как обычно в Q Dec.
Но я «формы deriving в хаскеле» привёл как примеры полезной кодогенерации которые там видел - Derive* расширения, derive пакеты. Ещё можно вспомнить разные DSL для routes, css, js, html в yesod (тут уже и top-level c TH/QQ для Dec, и просто QQ для Exp).
Вот, кстати, в Scala/Play! тоже в своё время перешли к таким type-safe DSLям для маршрутов и темплейтов, но там оно ещё без макросов, а * -> *.scala и с вырвиглазными парсерами, чекерами и принтерами :)
Исходная версия quasimoto, :
top-level или локальные - тут не важно
Это важно, например foo-using-bar-dsl.cc, bar-using-foo-cc.dsl - если *.dsl транслируется в *.cc, то есть в top-level формы, то мы тут легко получаем интерпортабельность просто на уровне символов линковки, вся сложность только в парсере, чекере (если нужен) и принтере. Поэтому кодогенерация top-level форм «никогда не была проблемой» - cpp, m4, свои велосипеды-трансляторы.
И это ни через рефлексию ни через ADT не сделать
Ну да, это должен быть либо механизм в языке, либо ручками.
Как в TH сделать макрос, раскрывающийся в определение другого макроса?
А в чём проблема? Пишется как обычно в Q Dec.
Но я «формы deriving в хаскеле» привёл как примеры полезной кодогенерации которые там видел - Derive* расширения, derive пакеты. Ещё можно вспомнить разные DSL для routes, css, js, html в yesod (тут уже и top-level и обычный TH для Exp).
Вот, кстати, в Scala/Play! тоже в своё время перешли к таким type-safe DSLям для маршрутов и темплейтов, но там оно ещё без макросов, а * -> *.scala и с вырвиглазными парсерами, чекерами и принтерами :)