1

请帮助我使用冒号:运算符,我不知道它是如何工作的。它作为赋值,通过赋值x+:1,全局赋值/视图::,I/O 0:1:从函数中间返回值:r,并获得一元形式的运算符#:

但是,如果将副词应用于它会发生什么?我试过这样:

$ q
KDB+ 3.6 2019.04.02 Copyright (C) 1993-2019 Kx Systems
q)(+')[100;2 3 4]
102 103 104
q)(:')[x;2 3 4]
'x
  [0]  (:')[x;2 3 4]
            ^
q)(:')[100;2 3 4]
2 3 4

我希望按顺序进行评估:x:2,然后x:3,然后x:4。结果得到x:4。但我有一个错误。并且还出于某种未知原因:'与数字一起使用。100

:'实际在做什么?

q)parse "(:')[100;2 3 4]"
(';:)
100
2 3 4

解析并没有给我带来太多启示,所以我正在寻求您的帮助。

4

1 回答 1

3

当被迭代器(在 q speak 中也称为副词)修改时,:其行为与任何其他二元运算符一样。在你的例子中

q)(:')[100;2 3 4]
2 3 4

一个原子100被扩展为一个一致的列表100 100 100,然后:成对地应用于两个列表的元素。返回最终结果。它可能看起来令人困惑(:试图修改一个常量值,真的吗?)但是如果你将它与任何其他二元运算符进行比较,并注意到它们从不修改它们的操作数而是返回表达式的结果,一切都应该点击到位。

例如,比较

q)+'[100; 2 3 4]
102 103 104

q)(:')[100;2 3 4]
2 3 4

在这两种情况下,都会隐式创建一个临时向量100 100 100,并将一个运算符应用于它,并且2 3 4。所以前者在语义上等价于

(t[0]+2;t[1]+2;t[2]+4)

而后者

(t[0]:2;t[1]:2;t[2]:4)

t那个临时向量在哪里。

这解释了为什么(:')[x;2 3 4]会出现错误——如果x不存在 kdb 无法将其扩展为列表。

于 2020-05-03T09:35:49.653 回答