Я написал небольшой скрипт m4 (test.m4
) для тестирования:
define(`test', `ifelse(`$#', `1', `$1', test(shift($@)))')
test(`arg1', `arg2')
и запустил его с m4 test.m4 -t test -de
1. Результат был
m4trace: -1- test -> ifelse(`2', `1', `arg1', test(shift(`arg1',`arg2')))
m4trace: -2- test -> ifelse(`1', `1', `arg2', test(shift(`arg2')))
m4trace: -3- test -> ifelse(`1', `1', `', test(shift(`')))
m4trace: -4- test -> ifelse(`1', `1', `', test(shift(`')))
.
.
.
пока выполнение не было прервано из-за превышения предела рекурсии. Я задавался вопросом, почему это так, потому что на самом деле 1
и 1
должны сравниваться равными, а макрос if else
должен оцениваться как `'
.
Однако мне пришла в голову новаторская идея поместить [not-equal]
в кавычки. отметки, поэтому макрос выглядел так:
define(`test', `ifelse(`$#', `1', `$1', `test(shift($@))')')
test(`arg1', `arg2')
и вуаля, это сработало как чудо (то есть arg2
было напечатано вместе с началом новой строки).
Вывод (с теми же параметрами вызова):
NL
m4trace: -1- test -> ifelse(`2', `1', `arg1', `test(shift(`arg1',`arg2'))')
m4trace: -1- test -> ifelse(`1', `1', `arg2', `test(shift(`arg2'))')
arg2
(NL
означает "новая строка").
Мой вывод: несмотря на то, что две сравниваемые строки фактически равны, препроцессор оценивает [not-equal]
тем не менее.
Есть ли у этого какая-то конкретная цель? ИМО, это просто неинтуитивно. Или я что-то упускаю?
1 -t test
включает трассировку отладки для макроса test
. -de
добавляет определение вызванного макроса в выходные данные отладки.