Код:
// Без DSL:
auto result = bind(mx, [&](auto x) {
return bind(my, [&](auto y) {
return make_value(x, y);
});
});
// С DSL:
auto result = DO(
LET x IS(mx);
LET y IS(my);
return make_value(x, y);
);
Дополнение 1: Принцип работы DSL в разрезании потока на токены. "LET name IS(value)" раскрывается в "), _LET_IS(name, (value)), _CODE(". Таким образом, весь код оказывается в блоках "_CODE", а "LET IS" и прочее выходят как метки. Дальше нужно лишь пройтись по всем меткам и обработать. В DSL поддерживаются циклы (WHILE, BREAK, CONTINUE) и ветвления (IF). Циклы работают через рекурсию. Внутри таких блоков кода можно использовать другие блоки (IF, WHILE, LET IS).
Дополнение 2: Вышла статья с объяснением принципа работы.
Источник: https://www.opennet.ru/opennews/art.shtml?num=64975
(opennet.ru, мини-новости)