GNU m4: экранирование обратных кавычек (`)

Простой вопрос GNU m4, но я не могу найти правильный ответ. Я хотел бы напечатать заголовок уценки, начиная/заканчивая раздел кода:

```
echo Hello
```

Как создать макрос GNU M4, содержащий 3 обратных кавычки? что-то типа

define(`md_code',````')
md_code
echo Hello
md_code

person Pierre    schedule 08.04.2015    source источник


Ответы (1)


получил ответ от Эрика Блейка из списка рассылки M4: http://lists.gnu.org/archive/html/m4-discuss/2015-04/msg00004.html

changequote — твой друг. Это сделает это:

define(`md_code', changequote([, 
])[changequote([,])```changequote(`,')]changequote(`,'))

Мне приходится менять кавычки дважды: один раз вокруг определения макроса, так как само определение намерено использовать (обратные кавычки) несбалансированным образом; и снова в расширении макроса, так как расширение будет выводить обратные кавычки несбалансированным образом; для каждой измененной котировки необходимо восстановить исходные котировки. Это предполагает, что цитирование по умолчанию остается (обратные кавычки) ' на протяжении всего запуска m4.

Хотя в вашем случае я бы порекомендовал использовать changequote заранее для чего-то другого и глобально написать свой ввод в соответствии с этими правилами цитирования вместо правил цитирования по умолчанию (обратные кавычки). Помните, что autoconf намеренно использовал [ ] в качестве символов кавычек, потому что они, скорее всего, будут сбалансированы в выводе, в отличие от (обратных кавычек) и ' не встречающихся в сбалансированных парах в сценариях оболочки. На самом деле выбор 2- или 3-байтовых строк в кавычках еще менее неоднозначен, хотя и требует большего набора текста.

person Pierre    schedule 09.04.2015