3

In various web pages, I see references to jq functions with a slash and a number following them. For example:

walk/1

I found the above notation used on a stackoverflow page.

I could not find in the jq Manual page a definition as to what this notation means. I'm guessing it might indicate that the walk function that takes 1 argument. If so, I wonder why a more meaningful notation isn't used such as is used with signatures in C++, Java, and other languages:

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

Can anyone confirm what the notation <function>/<number> means? Are other variants used?

4

1 回答 1

3

符号名称/数量给出了函数的名称和数量。“arity”是参数(即参数)的数量,例如,explode/0 表示您只需编写explode不带任何参数的内容,而 map/1 表示您将编写类似map(f).

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

这个符号在 jq 程序中不使用,但它用于(新的)内置过滤器的输出中,builtins/0.

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

为什么?

当尝试将适用于方法调度基于类型的语言移植到调度仅基于arity的语言时,通常会出现各种困难。

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

第二个是,一般来说,jq 函数不要求它们的参数是任何一种 jq 类型。不得不写一些类似的东西,nth(string+number)而不仅仅是写东西nth/1,充其量是乏味的。

这就是手册极力避免使用“名称(类型)”样式符号的原因。因此,例如,我们看到 ,startswith(str)而不是startswith(string)。也就是说,文档中的参数名称显然只是名称,当然它们通常会给出强类型提示。

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

总之——任何符号方案都可以工作,但name/arity(1)简洁;(2) 在 jq 上下文中精确;(3) 简单易学;(4) 至少在这个星球上广泛用于面向数量的语言。

于 2017-01-21T22:15:18.853 回答