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>
- GNU M4 — GNU macro processor [Архівовано 2 липня 2017 у Wayback Machine.] (англ.)
- Макропроцессор m4 [Архівовано 15 червня 2017 у Wayback Machine.] (рос.)