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

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

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

м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>

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