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>

Посилання[ред. | ред. код]