jq 符号 <function>/<number> 是什么意思?

What does the jq notation <function>/<number> mean?

在各种网页中,我看到对 jq 函数的引用带有一个斜杠和一个数字。例如:

walk/1

我发现 页面上使用了上述符号。

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

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

任何人都可以确认符号 <function>/<number> 是什么意思吗?是否使用了其他变体?

符号name/arity给出了函数的名称和数量。 "arity" 是参数(即参数)的数量,所以例如 explode/0 意味着你只写 explode 没有任何参数,而 map/1 意味着你会写类似于 map(f)

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

此表示法未在 jq 程序中使用,但在(新)built-in 过滤器 builtins/0.

的输出中使用

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

为什么?

在尝试将适用于 method-dispatch 基于类型的语言的符号移植到仅基于元数的语言上时,通常会遇到各种困难。

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

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

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

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

总而言之——任何符号方案都可以使用,但name/arity (1) 简洁; (2) jq上下文中的precise; (3) easy-to-learn; (4) 广泛用于 arity-oriented 种语言,至少在这个星球上是这样。