首页 > 解决方案 > range(2,5) 和 range(2;5) 之间的区别

问题描述

模板

range(2;5)

生产:

2
3
4

不是很有趣,因为这是由手册解释的。然而对于命令式程序员来说只是时间问题,他会错误地用逗号分隔参数(实际上我误读了手册,所以这是我的第一次尝试),然后尝试模板:

range(2, 5)

产生令人惊讶的:

0
1
0
1
2
3
4

那是什么?它是如何定义/解释的?

标签: functionsyntaxjq

解决方案


“逗号”运算符(如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,当然它以特殊的方式处理它的第一个参数。

由于def E($x):等价于def E(x): x as $x,定义bow

def bow($s): reduce $s as $word ({}; .[($word|tostring)] += 1);

将具有完全不同(且无用)的语义。


推荐阅读