【问题标题】:What does the jq notation <function>/<number> mean?jq 符号 <function>/<number> 是什么意思?
【发布时间】:2017-06-06 16:36:45
【问题描述】:

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

walk/1

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

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

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

谁能确认&lt;function&gt;/&lt;number&gt;这个符号是什么意思?是否使用了其他变体?

【问题讨论】:

    标签: jq notation arity


    【解决方案1】:

    符号名称/数量给出了函数的名称和数量。 “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) 至少在这个星球上广泛用于面向数量的语言。

    【讨论】:

    • 由于 arity 在 jq 程序中不使用,为什么在 jq 讨论中使用这种符号?更有意义的符号可能有助于使手册形式化。例如,在手册中,可以看到startswith(str)。由于 jq 中允许的类型被精确定义为null|boolean|number|string|array|object 之一,那么我认为startswith(string) 会比startswith/1 或手册中的内容更好。 element 可以用来表示“任何类型”。可以像string|array 那样明确指定替代方案。 (void)省略 可以指定 0 个参数。谢谢!
    • @SteveAmerige 这与符号的含义不同。如果你想知道为什么会被使用,最好找jq的作者交流。
    • @chepner 同意。我投了赞成票并接受了答案。我也会尝试找出原因。但是,你是对的,我得到了我所问问题的答案。快乐的日子!
    • 现在(一年后)手册中的“内置”下列出了一个提示。由于 jq 的主要大师在他们的示例和讨论中都使用这个简写,这对于像我这样的低级菜鸟来说是一个主要的障碍。在茶会上感觉像爱丽丝。
    • @CharlesRoss - 所以也许你可以解释一下为什么乌鸦像写字台?烤饼?
    猜你喜欢
    • 2017-05-25
    • 2011-04-07
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    • 2010-09-29
    • 2011-04-18
    • 1970-01-01
    相关资源
    最近更新 更多