Что означает запись jq <function>/<number>?
На различных веб-страницах я вижу ссылки на функции jq с косой чертой и номером, следующим за ними. Например:
walk/1
Я нашел вышеупомянутые обозначения, используемые на странице stackru.
Я не смог найти на странице руководства jq определения того, что означает эта запись. Я предполагаю, что это может означать, что walk
функция, которая принимает 1 аргумент. Если так, то мне интересно, почему не используются более значимые обозначения, такие как используется с сигнатурами в C++, Java и других языках:
<function>(type1, type2, ..., typeN)
Кто-нибудь может подтвердить, что обозначение <function>/<number>
средства? Используются ли другие варианты?
1 ответ
Обозначение name/arity дает имя и арность функции. "arity"- это число аргументов (то есть параметров), поэтому, например, explode / 0 означает, что вы просто напишите explode
без аргументов, а map / 1 означает, что вы напишите что-то вроде map(f)
,
Тот факт, что 0-арные функции вызываются по имени без скобок, делает запись особенно удобной. Тот факт, что имя функции может иметь несколько определений одновременно (каждое определение имеет свою особенность), позволяет легко различать их.
Эта нотация не используется в программах jq, но она используется в выходных данных (нового) встроенного фильтра, builtins/0
,
Напротив, в некоторых других языках программирования это (или некоторый близкий вариант, например, модуль: имя / арность в Erlang) также является частью языка.
Зачем?
Существуют различные трудности, которые обычно возникают при попытке привить нотацию, подходящую для языков, в которых метод-диспетчеризация основана на типах, на типы, в которых диспетчеризация основана исключительно на арности.
Первый, как уже отмечалось, связан с 0-арными функциями. Это особенно проблематично для jq, так как функции 0-арности вызываются в jq без скобок.
Второе - это то, что в общем случае функции jq не требуют, чтобы их аргументы были одного типа jq. Приходится писать что-то вроде nth(string+number)
а не просто nth/1
было бы утомительно в лучшем случае.
Вот почему руководство усиленно избегает использования обозначений в стиле "имя (тип)". Таким образом, мы видим, например, startswith(str)
, скорее, чем startswith(string)
, То есть имена параметров в документации явно являются просто именами, хотя, конечно, они часто дают строгие подсказки типов.
Если вам интересно, почему в руководстве не задокументировано соглашение "имя / arity", то, скорее всего, это связано с тем, что документация была в основном написана до того, как jq поддерживал многоартерические функции.
Подводя итог, можно использовать любую схему обозначений, но name/arity
является (1) кратким; (2) точный в контексте jq; (3) легко учиться; и (4) широко используется для языков, ориентированных на arity, по крайней мере, на этой планете.