Я хотел бы использовать m4
в качестве препроцессора для нескольких разных языков сценариев, в которых нет этой возможности.
В частности, мне нужно эмулировать функциональность препроцессора C (cpp
) условного включения кода:
#if something
some
long
code
block
#else
alternate
code
block
#if something-else
do
more
stuff
#endif
#endif
ifelse()
m4 не особенно подходит для длинных блоков кода, поэтому кажется, что мне по существу нужно написать макросы m4, чтобы эмулировать это, проверяя условие, а затем используя divert
для включения или исключения блоков по мере необходимости.
Сложная часть будет отслеживать уровни вложенности; насколько я могу судить, для этого мне придется реализовать свой собственный стек в m4. Это кажется концептуально простым, и я уверен, что через день или два взлома я смогу получить работающую систему.
Но это похоже на изобретение велосипеда. Я, конечно, не могу быть первым человеком с этой потребностью. Существующие, проверенные, надежные решения, безусловно, лучше, чем все, что я могу собрать, будучи новичком в ранге m4.
Существуют ли общие идиомы m4 для этого? Существует ли для этого код m4 с открытым исходным кодом? Копание в поисковиках ничего полезного не дало.
(Использование самого cpp не будет работать по причинам, указанным в собственной документации cpp: «Он будет подавляться при вводе, который не подчиняется лексическим правилам C». Похоже gpp имеет эту функциональность из коробки, поэтому ее использование может иметь больше смысла, но я предпочитаю вездесущность m4, если не слишком сложно заставить m4 делать это.)