Как известно, выполнение программы, написанной на 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 – и множество других возможных применений…