Есть такой не хитрый макрос: Код (Text): macro zzz p,[a] { common display '1' forward ;или reverse display '2' common display '3' } при его вызове zzz z компилятор выводит на экран 123 это баг или фича?
Ну, я бы расчитывал получить 13 без 2йки, ведь параметров в квадратных скобках нет и форвард должен выполниться 0 раз...
dead_body Во-первых, в примере Black_mirror группы отсутствуют, ведь группируются только параметры a, а z нельзя принять за a. z должно быть принято за p. Во-вторых, в документации есть пример strtbl, в котором наглядно показано, что группа аргументов - это параметры в скобках, а не все параметры. Конечно, ситуацию с нулевым кол-вом аргументов можно считать особым случаем, но это должно быть освещено в документации.
не понял, где это там показано. Можеш носом ткнуть? у Black_mirrorа две группы аргументов, вроде как. p - первая группа из одиночного аргумента,[a] - вторая группа. в примере strtbl всё так же.(только как мне кажеться, у второго аргумента надо * поставить) что бы strtbl так начинался: macro strtbl name,[string*]
dead_body Аргумент name не обрабатывается в forward. name обрабатывается в common. Если бы name обрабатывался в forward, то это был бы уже не классический string table.
Не баг, т.к. вроде в документации прямо не указано, что если аргументов нет, то блок не будет обработан. Но отсутствие фичи налицо. А во всех сорцах есть явная проверка на наличие агрументов (в документации пример без оной): Код (Text): macro m a*,[b] { common display '1' if ~ b eq forward display '2' end if common display '3' %%L } Правда, if - директива ассемблера. Для препроцессора надо типа этого: Код (Text): macro m a*,[b] { common display '1' match args,b \{ forward display '2' common \} common display '3' }