В 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
и след като опитах няколко различни начина за абстрахиране на части от макроса, почти съм готов да се откажа.