我想了解以下声明中发生的事情:
sum(til 100) where 000011110000b
该行评估为22,我无法弄清楚原因。 sum(til 100)
是4950
。 where 000011110000b
返回列表4 5 6 7
。 kdb参考页面似乎没有解释这个用例。为什么上面的行评估为22?
另外,为什么以下行导致错误
4950 where 000011110000b
答案 0 :(得分:3)
方括号用于函数调用参数,而不是括号。所以上面的解释是:
sum[(til 100) where 000011110000b]
你现在可以看到为什么它会评估为22,即它是列表til 100
的第5,第6,第7,第8个值的总和,即(0 ... 99),因为where
使用布尔列表til 100
000011110000b
q)til[100] where 000011110000b
4 5 6 7
正如您将注意到的,在调用函数时可以省略方括号;但是这样做时你需要确保它将被解析/解释为预期。通常,代码将从从右向左进行评估,因此在这种情况下,首先评估(til 100) where 000011110000b
,并将结果传递给sum
函数。
关于4950 where 000011110000b
- 如果我们从右到左思考,解释器会尝试将where 000011110000b
的结果传递给函数4590
。虽然4590
不是kdb中的命名函数 - 这是用于IPC的格式,即通过TCP在其他kdb进程上执行命令。因此,您告诉kdb使用操作系统文件描述符编号4590(几乎肯定不会对应于有效的TCP连接)来运行命令where 000011110000b
。请参阅"消息格式"有关详细信息,请参阅此处
http://code.kx.com/q/tutorials/startingq/ipc/