В GNU M4 я пытался написать функцию, которая определяет, сколько непустых (аргументов, не равных `'
) передано ей.
Он должен вызываться так:
ne_nargs(0, `1', `')
# 1
ne_nargs(0, `')
# 0
ne_nargs(0, `1')
# 1
Обратите внимание, что первым аргументом всегда должно быть 0
.
Вот код, который у меня есть до сих пор:
define(`ne_nargs', `ifelse(`$#', `1`, $1,
`ifelse(`$2', `', `pushdef(`$2', $1)ne_nargs(shift($@))',
`pushdef(`$2', incr($1))ne_nargs(shift($@))')')')
И вот псевдокод для него:
if (number_of_args == 1); then
return first_arg; // which is `0` by default.
else if (second_arg == ''); then
second_arg = first_arg;
return ne_nargs(shift(all_args));
else
second_arg = (++first_arg);
return ne_nargs(shift(all_args));
ne_nargs(`0', `', `1', `i', `', `l')
# what I get
m4:test.m4:8: empty string treated as 0 in builtin `incr'
m4:test.m4:8: empty string treated as 0 in builtin `incr'
1
# what I expect
3
Я не могу понять, что я делаю неправильно в определении ne_nargs
, и, попробовав несколько разных способов абстрагирования частей макроса, я почти готов сдаться.