jq表示法<function> / <number>是什么意思?

时间:2017-01-21 21:39:26

标签: jq notation arity

在各种网页中,我看到对带有斜杠的jq函数的引用以及跟随它们的数字。例如:

walk/1

我在stackoverflow页面上找到了上述符号。

我在jq Manual页面中找不到这个符号含义的定义。我猜它可能表明walk函数需要1个参数。如果是这样,我想知道为什么没有使用更有意义的符号,例如在C ++,Java和其他语言中使用签名:

<function>(type1, type2, ..., typeN)

任何人都可以确认符号<function>/<number>的含义吗?是否使用了其他变体?

1 个答案:

答案 0 :(得分:3)

符号name / arity给出函数的名称和arity。 “arity”是参数的数量(即参数),因此例如explode / 0意味着你只需要编写explode而没有任何参数,map / 1意味着你要编写类似{{1}的东西}。

通过名称调用0-arity函数而没有任何括号的事实使得符号特别方便。函数名称在任何时候都可以有多个定义(每个定义具有不同的arity)这一事实使得很容易区分它们。

这种表示法不用于jq程序,但它用于(新)内置过滤器map(f)的输出。

相比之下,在其他一些编程语言中,它(或一些密切的变体,例如模块:Erlang中的name / arity)也是该语言的一部分。

为什么?

当试图移植一种适用于语言的符号时,通常会出现各种困难,其中方法调度基于类型,其中调度仅基于arity。

如前所述,第一个与0-arity函数有关。这对于jq尤其有问题,因为在没有括号的jq中调用了0-arity函数。

第二个是,通常,jq函数不要求它们的参数是任何一个jq类型。必须编写类似builtins/0而不仅仅是nth(string+number)之类的东西,充其量只是单调乏味。

这就是为什么手册极力避免使用“名称(类型)” - 样式表示法。因此,我们会看到nth/1,而不是startswith(str)。也就是说,文档中的参数名称显然只是名称,当然它们通常会提供强大的类型提示。

如果您想知道为什么手册中没有记录'name / arity'约定,那可能主要是因为文档主要是在jq支持的多功能函数之前编写的。

总之 - 任何符号方案都可以起作用,但startswith(string)是(1)简洁; (2)在jq环境中精确; (3)易学; (4)广泛用于面向文明的语言,至少在这个星球上。