Анонимные макросы
реализованы! Использование:
EXEC_MLAMBDA(MLAMBDA(ARG + ARG), 1)
Выдаёт
1 + 1
, как и ожидалось.
Теперь рассмотрим как это работает.
MLAMBDA(ARG + ARG)
раскрывается в:
((_0, _1 ),(poica_pri_arg, _0, _1),(_0, _1),( + ),(poica_pri_arg, _0, _1),(_0, _1),( _0, _1))
Затем макрос
EXEC_MLAMBDA
к каждый элемент списка применяет к другому макросу, перегруженному по кол-ву аргументов. Так происходит подстановка:
(_0, _1)
- <пробел>
(poica_pri_arg, _0, _1)
- раскрывается во второй аргумент
EXEC_MLAMBDA
(X)
- раскрывается в
X
Говоря словами, лямбда-макрос - это просто список, ненужные элементы которого игнорируются, части тела остаются неизменными, а аргументы подставляются.