m4: Макросы, задействованные с помощью итерации, не заменяются (Продолжение: Итерация переменного списка аргументов в макросе?)

Модератор: Модераторы разделов

nick87720z
Сообщения: 180
ОС: Gentoo / Calculate

m4: Макросы, задействованные с помощью итерации, не заменяются

Сообщение nick87720z »

Макросы forloop / _forloop я просто скопипастил, т.к. еще не разобрался, как точно работают.

Код: Выделить всё

define(`forloop',
       `pushdef(`$1',`$2')_forloop(`$1',`$2',`$3',`$4')popdef(`$1')'
      )

define(`_forloop',
       `$4`'ifelse($1,`$3', ,
                   `define(`$1',incr($1))_forloop(`$1',`$2',`$3',`$4')'
                  )'
      )

# Synopsis: methodsContainer( type, method1, method2, ...)
define(`methodsContainer',
`
struct $1_methods_tag
{
  typeof (& $1_myMethod1) myMethod1;
  typeof (& $1_myMethod2) myMethod2;

  forloop(`Method',1,$#,`typeof (& `$1'_$Method) $Method;')
};
')


Вот что оно выдает. Видно, что аргументы $1, $2 и т.д. не раскрыты.

Код: Выделить всё

methodsContainer(`myType',`myMethod1',`myMethod2',`myMethod3')

struct myType_methods_tag
{
  typeof (& myType_myMethod1) myMethod1;
  typeof (& myType_myMethod2) myMethod2;

  typeof (& myType_$1) $1;typeof (& myType_$2) $2;typeof (& myType_$3) $3;typeof (& myType_$4) $4;

...................(100400 пустых строк)................
};

Пробовал выносить $Method на внешний уровень, одновременно разбивая строку в соответствующем месте. Результат не изменился.
Спасибо сказали:
nick87720z
Сообщения: 180
ОС: Gentoo / Calculate

Re: m4: Макросы, задействованные с помощью итерации, не заменяются

Сообщение nick87720z »

Т.к. тема все еще здесь, поясню свою ошибку. Я забыл, что в случае с макросами в первую очередь раскрываются внешние определения. Выход - использовать функцию foreach или foreachq, которую (кстати, равно как и forloop и некоторые др.) можно найти среди примеров (в моем случае - /usr/share/doc/m4/examples).
Спасибо сказали: