Насчёт наркотиков, бреда и опострафов. Хм, ничего такого бредового не заметил, всё таки надо понимать, что это мощьнейший препроцессор, очень гибкий. Строки не обозначаются разными опострофами, сделайте info m4 и там написано, что это просто по дефолту, они могут обозначаться любыми символами, с помощью changequote(`[',`]') - это как раз пример из мануала. Можно потом уже писать foo([string]) . Не вдавался в глубокие познания относительно причин этого, но полагаю что это удобно для создания действительно сложных макросов и их использования, а также для устранения конфликтов с тем, как строки обрабатываются в конкретных языках программирования. Ну и немного о синтаксисе, по мне так удобный макропроцессор. Если грамотно пользоваться отступами и переводами строк, то и макросы получаются удобочитаемыми. Я правда не работал с оригинальным m4 и не знаю насколько gnu m4 сильно отличается от него, молод просто, чтобы застать его предка:) Но думаю, что немного неудобств внесено именно расширением m4 до его нынешнего состояния. Но если серьёзно, то синтаксис по мне так удобен, прост, а идеология напоминает идеологию функциональных языков, типо lisp, что особо интересно:)Теперь насчёт использования. Ну в основном использую его как замену Сишному препроцессору на сложных макросах. Поскольку пишу в основном на С, то хотелось найти такой препроцессор, который бы позволял писать нетривиальные макросы с разбором и трансформацией параметров. Чтобы возможно было его использовать для упрощения обращения к некоторым многословным конструкциям. В итоге нашёл 2а применения: -создание сложных макросов с вариантной подстановкой и прочими прелестями -создание макросов для упрощения взаимодействия со всякими монстрами, типо gobject и dbus. Фактически, работая сейчас над maps приложеним для freerunner получается упрощённая прослойка для dbus. Где допустим вызовы: coal_func(`coal_obj',`create',`DBUS_PATH_DBUS',`DBUS_INTERFACE_DBUS', object) int out; coal(`object.RequestName("org.foo",2):(&out)') Означают создание объекта по интерфейсу и обращение к методу RequestName. В общем некий такой m4 биндинг к libdbus:) Нечто подобное делаю и для gobject, но там в основном по мелочи и чисто для себя. А вот dbus биндинг стараюсь делать более-менее общим, чтобы возможно он был полезен и другим. Это конечно подобно использованию прокси в gobject, но затея заключается в том, чтобы как можно более упростить доступ к объектам, исключая многословие и как можно меньше делать в рантайме, чтобы уменьшить оверхед. Есть ещё такой небольшой гол, как асинхронность, thread safe и вариантость с присутствием или отсутствием основного цикла. Но это по мере работы над gps проектом. Потому как теория это одно, а вот опробировать на приложении с несколькими рабочими потоками и асинхронными вызовами - придётся:) Во что этот биндинг выльется через месяц-два сказать сложно, первоначальная затея была польностью реализовать xml-интроспекция парсер на perl + парсер на том же перле для С файлов, реализующий собственный язык-надстройку, типо objective-c. Но всё упростилось до одного xml парсера на перле + m4 макросов для С. Ну а как оно дальше будет удобно или нет, так оно и будет развиваться, в любом случае m4 остаётся приоритетным языком для макросов, уж очень он удобен. PS: будучи гибким препроцессором, m4 просто даёт возможность писать мощьнейшие макросы, позволяя программисту избавится от значителного рантайма и реже править заголовочные файлы, перекладывая работу на регекспы и генерацию макросов по ним. А не вручную править зависимые от чего-бы то ни было макросы. Ну конечно, применений тьма, оно понятно. Но пожалуй autotools и мощьный аналог шаблонам, по крайней мере для меня, это главное:) ПИЭС: m4 такое же средство как perl например, в руках админа, программиста и тд, оно позволяет больше времени сидеть в кресле и попивать чаёк, нежели истязать глаза до крови перед монитором:)
|