Команда:   m4  макро процессор
     Синтаксис:    m4 [D имя = значение] [U имя]
     Флаг:     D   Определенный (заданный) символ
     Флаг:     U   Неопределенный символ
     Пример:   m4 <m4test               # Запуск M4

     M4  -  макро  процессор, предназначенный  как  надстройка  для  Ratfor, Паскаля,
     и  других  языков программирования,  у  которых нет встроенной макро способности
     обработки. M4 считает данные  на стандартном входе, записывая затем обработанный
     текст на стандартной выходе.

     Параметры и их действие представлены ниже:

          D name[=val] Определенное имя и его значнеие, которое может быть пустым
          U name      Неопределенное имя


     Форма макро вызова следующая: name(arg1,arg2, ..., argn)

     Открывающая  скобка  '('  должна  обязательно  следовать  за  названием  макроса.
     Если  наименование определенного  макроса  не сопровождается (, то оно взято  для
     вызова этого макроса без аргументов, то есть  в виде  name(). Сущность макро имен
     состоит в алфавитных и цифровых записях.
	
     Приводятся  неупомянутые  до  этого пробелы, табуляторы  и проигнорированые новые
     строки, собранные аргументы.  Левые  и  правые  одинарные  кавычки  используются,
     чтобы указать строковые последовательности. Значение указанной последовательности
     в этом случае - последовательность, лишенная кавычек.

     Когда  макро-имена  распознаны,  его  указанные  аргументы  производят  поиск  на
     соответствие.   Если   аргументов  представлено  меньше,  чем   будет  найдено  в
     Макро вычисление обычно продолжается во время сборки аргументов, и  любые запятые
     или  правильные  круглые  скобки, которые, иногда располагаются выше, в  пределах
     вложенного значения и столь же эффективны  как и при оригинальном входном тексте.
     (Это  типичное  представление  измененного  "insideout"  макро-расширения). После
     сборки аргумента,  значение  макроса  будет пододвинуто обратно  на входной поток
     и повторно просмотрено.

     M4  делает  доступным следующий встроенный макроc. Он может быть изменен, но  как
     только  это  будет  сделано,  оригинальное значение утеряется. Значения  являются 
     пустыми если они не заявлены как то иначе.

     define "(name [, val])"    второй  аргумент  установлен   как   значение  макроса,
     наименование которого - первый аргумент.  Если  нет никакого второго аргумента, то
     значнеие является пустым.  Каждое событие $ n   в  тексте замены,  где  n - цифра,
     замененяется n-th аргументом. Аргумент со значением  0 является названием макроса;
     недостающие аргументы заменены пустой строкой.

     defn "(name [, name ...])"     возвращает  указанное  определение  аргумента (ов).
     Полезен при выполнении операции переименования макросов.

     undefine "(name [, name ...])"     удаляет   определение  по  имени  макроса (ов). 
     macro(s) named.  Если  имеется более  чем одно определение для названного макроса,
    (из-за предыдущего использования pushdef), все определения будут удалены.

     pushdef "(name [, val])"   как  заданное  значение,  при этом сохраняет предыдущее
     значение и складывает текущее значение

     popdef "(name [, name ...])"   удаляет  текущее  заданное значение аргумента (ов),
     устанавливая предыдущее значение в противном случае 
    
     ifdef "(name, if-def [, ifnot-def])"  если  первый  аргумент определен, то берется
     значене второй аргумента, в противном случае, третьего. Если нет никакого третьего
     аргумента,  значение  является  пустым.  Слово, указывающее  текущую  операционную
     систему, предопределено. (Например, unix или vms).


     shift "(arg, arg, arg, ...)"   возвращает  все, кроме  первого  аргумента.  Другие
     аргументы  указаны  и  пододвинуты  обратно  и  разделяются запятыми.  Цитирование
     аннулирует эффект дополнительного просмотра, который будет впоследствии выполнен.

     changequote "(lqchar, rqchar)"    изменяет  символы  цитаты  (ковычки)  у  первого
     и  второго аргумента.  Без  аргументов  кавычки  перезагружены  назад  к  символам
     по умолчанию. (то есть, `').

     changecom "(lcchar, rcchar)"  изменяет левые и правые маркеры комментария, которые
     по умолчанию обозначаются как  #. Без каких-либо аргументов  механизм  комментария
     перегружается обратно к символам по умолчанию. При наличии одного аргумента, левый
     маркер  становится  аргументом,  а  правый  маркер становится новой строкой.  Если 
     аргументов 2, то будут затронуты оба маркера.	 

     divert "(divnum)"     поддерживает  10  исходящих  потоков,  пронумерованных  0-9. 
     Первоначально текущим потоком является поток 0.  Затем  происходит макро-изменение
     текущего исходящего потока  к (цифровой последовательности) аргументу. Значения на
     выходе, отличимые от диапазона от 0 до 9, будут утеряны.
	 
     undivert "([divnum [, divnum ...]])"  вызывает немедленный выход текста измножеств,
     именуемых  как  аргумент (ы),  или  всех  множеств  если  нет  никаких  аргументов.
     Текст может быть подмножеством в  другом множестве.  По окончании  процесса входной
     обработки, M4 вызывает автоматическое изменение, если ничего не определено.
	 
     divnum "()" возвращет значение текущего исходящего (выходного) потока.

     dnl "()" читает и отменяет символы до и включая новую строку.

     ifelse "(arg, arg, if-same [, ifnot-same | arg,  arg  ...])"    имеет  три  и  более
     аргументов.  Если  первый  аргумент - та же самая последовательность  как  и  второй
     аргумент, то значением будет являться третий аргумент. В противном случае, если есть
     больше чем  четыре аргумента, процесс  будет  повторен  с  аргументами  4, 5, 6 и 7.
     Иначе,  значением  будет,  или  четвертая  последовательность, или,  при  отсутствие
     таковой, пустой указатель. 

     incr "(num)"    возвращает значение аргумента, увеличенного на 1.  Значение аргумента
     получено в виде интерпритации начальной последовательности цифр, как десятичное число.

     decr "(num)" возвращает значение аргумента в результате вычитания 1.

     eval "(expression)"  оценивает аргумент как постоянное выражение и используя при этом
     арифметику  целого  числа.  Механизм  оценки  очень  похож на   С++  (#if выражение).
     Выражение  может  содержать  только  константы  целого числа  и символьные константы,
     возможно связанные бинарными операторами || или одноместными 
          *    /    %    +    -    >>   <<    <     >    <=    >=
          ==   !=   &    ^    |     &&   ||
     или  унарные операторы -!,  тильду  или  троичный оператор  ?:.  Круглые скобки могут
     использоваться для того, чтобы сгруппировать аргументы. Восьмеричные числа могут быть
     определены как в языке C.
    

     len "(string)"  возвращает число символов в аргументе.

     index "(search-string, string)"  возвращает  позицию  в  первом аргументе, где второй
     аргумент начинается (нулевое значение), или 1, если второго аргумента нет.

     substr "(string, index [, length])"   возвращает  подстроку первого аргумента. Второй
     аргумент  -  нулевое  значение,  выбирающее первый символ (содержимое рассматривается
     как выражение);  третий аргумент  указывает длину подпоследовательности.  Недостающий
     третий аргумент является достаточно большим  и  берется для того, чтобы располагаться
     до конца первой последовательности.

     translit  "(source, from [, to])" последовательная транслитерация входящих аргументов.
     Если,  третий аргумент короче чем второй,  то  все  дополнительные символы во  втором
     аргументе, будут удалены  из  первого аргумента.  Если третий аргумент отсутствует  в
     записи, то все символы во втором аргументе, будут удалены из первого аргумента.

     include "(filename)" возвращает содержание файла, указанного в аргументе.

     sinclude "(filename)" идентично комнаде include, предназначена для включения,
     за исключением того, что это ничего не сообщается, если файл недоступен.

     paste "(filename)" возвращает содержание файла, указанного в аргументе без любой
     обработки, отличимой от этого включения.

     spaste "(filename)" идентично команде вставка, за исключением того,
     что ничего не говорится о файле и его допустимости.
	 
     syscmd "(command)" выполняет команду UNIX, заданную в качестве первого аргумента,
     не возвращая при этом его значение.
    
     sysval "()" возвращает код из последнего вызова syscmd.
     .PP maketemp '(string)" строковая последовательность XXXXXX, аргумент с
     ID текущего процесса.

     m4exit "([exitcode])" вызывает непосредственный выход из программы M4.
     Если задан аргумент равный 1, то он является кодом завершения; по умолчанию 0.
    
     m4wrap "(m4-macro-or-built-n)" аргумент 1 будет сдвинут обратно
     в конец EOF; Пример: m4wrap (`dumptable ()').

     errprint "(str [, str, str, ...])" отображает аргумент (ы) на stderr.
     Если аргументов несколько, более одного, то  каждый аргумент отделен
     пробелом  на выходе.  Может  быть  представлено  произвольное  число
     аргументов.

     dumpdef "([name,  name,  ...])"  напечатает текущие имена  и
     заданные значения для именованных пунктов или для всех, если
     никакие аргументы не заданы. 
    


     Автор


     M4 написал Ozan S. Yigif.