Создание собственной процедуры main

Известно, что выполнение программы, написанной на D, всегда начинается с процедуры main.

А что если хочется ее заменить своей процедурой?

Конечно, поставить стороннюю процедуру вместо main вряд ли получится, но можно пойти обходным путем, сгенерировав на этапе компиляции собственную процедуру main с помощью инструкции mixin и шаблона.

Для того, чтобы это проделать, необходимо сделать шаблон, который каким-либо образом вычисляет (т.е. создает строку) основной процедуры, а дальше просто «подмешать» его в основной код, например, так:

template RapidMain(string code)
{
    import std.format;

    const char[] RapidMain = format(
        `
        void main()
        {
            import std.stdio;
            %s
        }`,
        code
        );
}

immutable string GENERATED_WITH_RAPIDLAB_CODE = `
    %%GENERATED_WITH_RAPIDLAB_CODE%%`;

mixin(RapidMain!GENERATED_WITH_RAPIDLAB_CODE);

Это пример из одного моего проекта.

В шаблоне RapidMain, по сути дела, и происходит генерация процедуры main, которая ничем не отличается от стандартной (разве что, наличием дополнительного импорта), а вставка этой процедуры происходит с помощью инструкции mixin, в которую помещается наш шаблон и строка, которая содержит код на D, который мы хотим таким образом выполнить (Стоит понимать, что сначала происходит вставка кода описанного строкой в шаблон, затем происходит подстановка шаблона в mixin, а затем происходит выполнение сгенерированного таким образом кода).

Это дает ряд интересных возможностей, таких как выполнение определенного кода на стадии компиляции, кодогенерация, создание процедур инициализации GUI – и множество других возможных применений…

Добавить комментарий