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

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

M4
Парадигма Макрос
Творці Браян Керніган

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

Приклад використанняРедагувати

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

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

  • dnl — блокує вивід результату заміщення самих визначень, в даному випадку порожніх рядків;
  • define — вводить нове ім'я (перший аргумент), інші аргументи, якщо є, визначають спосіб заміщення
  • ifelse — груповий умовний оператор (на кшталт оператора swіtch мови 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>

ПосиланняРедагувати