Почему jq позволяет функции range () принимать запятую в качестве разделителя аргументов, если точка с запятой задокументирована? - PullRequest
1 голос
/ 07 мая 2020

Я пытаюсь выяснить, почему функция range() в jq допускает аргументы, разделенные ,, когда более общий стиль заключается в разделении аргументов ; для других функций? Я точно знаю, что если sub() или другие функции, используемые с ,, вызовут неопределенную ошибку, скорее всего, из-за несоответствия прототипа.

Но почему диапазон ведет себя так для range(from;upto) prototype

$ jq -n 'range(0; 4)'
0
1
2
3

и

$ jq -n 'range(0, 4)'
0
1
2
3

Для range(from;upto;by) использование , ведет себя некорректно, но я все равно хотел бы, чтобы предупреждение было выдано.

# runs as if did range(0; 2)
$ jq -n 'range(0, 4; 2)'
0
1

и

# runs as if did range(0; 4) + range(0; 2)
$ jq -n 'range(0; 4, 2)'
0
1
2
3
0
1

Это видно как в jq-1.6, так и в jq-1.5. Поскольку в официальной документации не говорится о типе прототипа с , и это маловероятно, как следует интерпретировать поведение с ,?

1 Ответ

2 голосов
/ 07 мая 2020

Вкратце, jq определяет диапазон / 1 как:

def range($x): range(0;$x);

Итак, диапазон (0, $ n) оценивается как

range(0), range($n)

, что дает поток empty, range($n), который эквивалентен потоку

range(0;$n)

Суть, пожалуй, в том, что оператор «запятая» можно использовать свободно.

...