function - range(2,5) 和 range(2;5) 之间的区别
问题描述
模板
range(2;5)
生产:
2
3
4
不是很有趣,因为这是由手册解释的。然而对于命令式程序员来说只是时间问题,他会错误地用逗号分隔参数(实际上我误读了手册,所以这是我的第一次尝试),然后尝试模板:
range(2, 5)
产生令人惊讶的:
0
1
0
1
2
3
4
那是什么?它是如何定义/解释的?
解决方案
“逗号”运算符(如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);
将具有完全不同(且无用)的语义。
推荐阅读
- javascript - 如何将状态从子组件传递到应用程序组件
- java - ExodusException:写不在进行中
- python - 使用scrapy抓取html元素时将空列表作为输出
- javascript - 我想从带有 css 或 js 的选项卡中隐藏一些选择的 li 项目
- networking - ESP8266 在 WIFI 网络中不接收数据包
- excel - VBA 不匹配 IF 语句
- asp.net - 授权从资源应用程序到身份应用程序的请求
- php - 在 Blade 的模板中创建可选部分(Laravel 框架)
- r - R获取最大日期字符串
- postgresql - 如何在 Spring Data R2DBC 中禁用 Postgres 自动提交