Рекурсия в STP: макрос, который сводит с ума, но работает

Разбираемся, как макропроцессор STP умудряется выполнять рекурсию — и почему это похоже на попытку склеить разбитую вазу суперклеем.
Вы когда-нибудь задумывались, можно ли заставить макросы делать рекурсию? Если нет — вы явно не работали с STP. Этот макропроцессор, который обычно используют для генерации кода или шаблонов, вдруг оказался способен на настоящую рекурсию. И да, это звучит как оксюморон.
Как это работает?
STP (Standard Template Processor) — это не тот инструмент, который ассоциируется с рекурсией. Обычно макросы просто заменяют текст, как копирайтер в плохой день. Но STP позволяет определять макросы, которые вызывают сами себя, создавая циклы. Правда, с одним условием: нужно быть аккуратным с условиями выхода, иначе ваш терминал зависнет в бесконечном цикле, как Jira с 47 столбцами.
- Пример: макрос, который считает факториал. Да-да, прямо в макросе. Выглядит это как заклинание, но работает.
- Ограничения: STP не оптимизирован для глубокой рекурсии. После 1000 итераций он просто падает, как разработчик после ночного деплоя.
Зачем это нужно?
В реальной жизни рекурсия в макросах — это как швейцарский нож: вроде бы круто, но пользуешься раз в год. Однако для генерации сложных структур данных или шаблонов с повторяющимися элементами — это спасение. Например, можно создать макрос, который генерирует HTML-таблицу любой вложенности. Или конфигурацию для Kubernetes с кучей повторяющихся блоков.
Комментарий студии METABYTE
Рекурсия в макросах — это как найти баг в продакшене и понять, что он был фичей. В METABYTE мы любим такие неожиданные решения, но предпочитаем, чтобы код был предсказуемым. Если вам нужно что-то сложнее макросов — мы знаем, как это сделать без рекурсивных головоломок.