M4 (мова програмування)

m4 — макропроцесор, декларативна міні-мова програмування, розроблена в 1977 році програмістами Браяном Керніганом і Деннісом Рітчі. Призначений для копіювання вхідного символьного потоку у вихідний з перетворенням рядків шляком заміщення макросів їх значеннями.

M4
Дата появи 1977
Творці Браян Керніган

m4 підтримує вбудовані макроси як власні функції, так і визначені користувачем. Макрос може приймати довільне число аргументів. Вбудовані макроси забезпечують включення файлів, виконання зовнішніх команд, арифметичні операції над цілими числами, маніпуляцію рядками тощо.

Приклад використання ред.

Нижче наведено приклад використання m4 для генерації вебсторінки, у прикладі показано передачу в макроси аргументів та рекурсивний виклик функції.

Файл визначень макросів html.m4, визначає макроси користувача, містить вбудовані макроси та змінні:

  • dnl — блокує вивід результату заміщення самих визначень, в даному випадку порожніх рядків;
  • define — вводить нове ім'я (перший аргумент), інші аргументи, якщо є, визначають спосіб заміщення
  • ifelse — груповий умовний оператор (на кшталт оператора switch мови C), визначає трійки з парою для порівняння та результатом при тотожності, останній аргумент, якщо є, визначає результат або подальші дії в разі нетотожності
  • shift — здійснює зсув списку аргументів та зменшує лічильник їх кількості;
  • $@ $# @1 — список аргументів, число аргументів, аргумент 1 відповідно.
define(_startpage,
`<head><title>$1</title></head>
<body>
<h1>$1</h1>')dnl
dnl
define(_listitems,
`ifelse($#, 0, ,
$#, 1, `<li>$1</li>',
`<li>$1</li>
_listitems(shift($@))')')dnl
dnl
define(_ul,
`<p>$1</p>
<ul>
_listitems(shift($@))'
</ul>)dnl
dnl
define(_endpage,
`<p>Last change: esyscmd(`date')</p>
</body>
</html>')dnl

Файл для обробки doc.txt, містить виклики макросів з передачею аргументів або без аргументів:

_startpage(Sample Page)
_ul(Sample list, First item, Second item)
_endpage

Результат виконання команди m4 html.m4 doc.txt:

<head><title>Sample Page</title></head>
<body>
<h1>Sample Page</h1>
<p>Sample list</p>
<ul>
<li>First item</li>
<li>Second item</li>
</ul>
<p>Last change: субота, 24 червня 2017 13:03:50 +0300
</p>
</body>
</html>

Посилання ред.