模板
range(2;5)
制作:
2
3
4这是不是很有趣,因为这是由手册解释的。然而,对于命令式程序员来说,这只是时间问题,当他错误地用逗号分隔参数时(实际上我误读了手册,所以这是我的第一次尝试),然后尝试模板:
range(2, 5)令人惊讶:
0
1
0
1
2
3
4那是什么?它是如何定义/解释的?
发布于 2020-11-13 21:00:25
“逗号”运算符(如在2,5中)生成流。因此,2,5发出两个整数,这就是为什么[2,5]计算为一个由两个整数组成的数组的原因。
通常,如果E/1使用与def E($x):等效的表单(即作为“常规”函数)定义,那么E(a,b)将发出流E(a),然后是流E(b)。
事实上,range/1被定义为“正则函数”。
非正则函数
下面是一个非正则函数的例子:
# Emit a single JSON object ("bow" is short for "bag of words")
def bow(stream):
reduce stream as $word ({}; .[($word|tostring)] += 1);注意,这里的函数参数(stream)传递给reduce,当然,reduce以一种特殊的方式处理其第一个参数。
因为def E($x):等同于def E(x): x as $x,所以将bow定义为
def bow($s): reduce $s as $word ({}; .[($word|tostring)] += 1);会有完全不同的(和无用的)语义。
发布于 2020-11-14 03:10:42
峰的答案是正确的,但我觉得它覆盖了最基本的部分.逗号根本不用于分隔jq中的函数args,因为它“已被接受”,而且jq几乎没有语法重载。
因为所有函数都隐式地接受流(输入为.)并对流进行计算,所以非常多的函数在语法上是0-adic (例如tostring),其余的大部分都是语法1-adic (例如,以分隔符作为参数的split(str),以及使用该分隔符隐式拆分的值)。对于使用多个显式参数的罕见函数(如range和sub ),分号用作分隔符,而不是逗号。
由于jq不是一种面向语句的语言,这几乎是分号的唯一用法。它唯一出现的地方是标记函数定义的结束,这不会引起太多的混乱。
https://stackoverflow.com/questions/64827742
复制相似问题