Re[17]: Метапрограммисты надоели
От: Evgeny.Panasyuk Россия  
Дата: 08.10.14 02:13
Оценка:
Здравствуйте, alex_public, Вы писали:

_>P.P.S. А если говорить о сложном МП... Могу ли я сейчас реализовать на Немерле аналог этого http://vibed.org/features#diet-templates решения? ) Ну т.е. чтобы можно было создавать отдельные файлы, целиком написанные на некотором DSL (не имеющем нечего общего с C# или Немерле, но возможно имеющем вкрапления из них), а потом писать где-то create_page("dsl file name") и в этой точке компилятор вставлял (причём с полной последующей оптимизацией) сгенерированный по тому файлу код. Ну и естественно это всё должно быть реализовано просто как библиотека на Немерле, а не какой-то внешний инструмент препросессинга.


Да, возможно, вот пример
Автор: catbert
Дата: 13.12.11
.
Насколько я понял, макросы компилируются в отдельную динамическую библиотеку, которая подцепляется компилятором во время обработки "остального" кода. Такая библиотека, по сути, и является внешним инструментом. Например, предполагаю что макрос не может ссылаться на какой-либо элемент сборки использующий этот макрос, так как во время "запуска библиотеки с макросом" ещё нет той самой сборки, использующей его.
Думаю что можно подобрать некий синтетический пример показывающий ограничения такого подхода по сравнению с "не внешним" инструментом. Например, что-то типа:
import std.stdio;

string generator(bool x)()
{
    static if(x)
        return test();
    else
        return `string r = "wri";`;
}

string test()
{
    mixin(generator!(false)());
    return r ~ `teln("test\n");`;
}

void main()
{
    writeln(test());
    mixin(generator!(true)());
}
Сходу чего-то более реального не придумал.

P.S. В Nemerle, также, есть и другая интересная возможность: при использовании внутри кода программы некоторой compile-time-строки-DSL, IDE может подсвечивать ошибки внутри этой DSL строки, например ошибку в XML.
Отредактировано 08.10.2014 2:20 Evgeny.Panasyuk . Предыдущая версия . Еще …
Отредактировано 08.10.2014 2:16 Evgeny.Panasyuk . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.