Kdb 副词在冒号运算符中的应用

Kdb 副词在冒号运算符中的应用,kdb,k,Kdb,K,请帮我弄一下冒号:接线员,我不知道它是怎么工作的。它作为赋值,通过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]

请帮我弄一下冒号:接线员,我不知道它是怎么工作的。它作为赋值,通过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

解析对我来说没什么帮助,所以我请求你的帮助。

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

q)(:')[100;2 3 4]
2 3 4
将原子100扩展为共形列表100,然后:成对应用于两个列表的元素。返回最终结果。它可能看起来很混乱:试图修改一个常量值,真的吗?但如果您将其与任何其他二元运算符进行比较,并注意到它们从不修改操作数,而是返回表达式的结果,则所有内容都应单击到位

例如,比较

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

在这两种情况下,隐式创建临时向量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无法将其扩展到列表。

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

q)(:')[100;2 3 4]
2 3 4
将原子100扩展为共形列表100,然后:成对应用于两个列表的元素。返回最终结果。它可能看起来很混乱:试图修改一个常量值,真的吗?但如果您将其与任何其他二元运算符进行比较,并注意到它们从不修改操作数,而是返回表达式的结果,则所有内容都应单击到位

例如,比较

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

在这两种情况下,隐式创建临时向量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无法将其扩展到列表。

棘手的事情,隐式创建的临时向量。现在很清楚为什么它与x:1或与之前初始化的相同长度向量x:123一起工作。非常感谢!请接受我关于用一小撮盐隐式创建向量的话。Kdb可能使用也可能不使用各种优化,具体取决于运营商。我不知道当kdb需要将一个原子扩展到一个列表时内部会发生什么,但它的行为就像创建了一个临时对象一样。完全同意-kdb的优化可能非常棘手。通过内存分析,我希望能够间接证实一些假设。但如何分析q程序的问题对我来说仍然是个未知数。棘手的事情,一个隐式创建的临时向量。现在很清楚为什么它与x:1或与之前初始化的相同长度向量x:123一起工作。非常感谢!请接受我关于用一小撮盐隐式创建向量的话。Kdb可能使用也可能不使用各种优化,具体取决于运营商。我不知道当kdb需要将一个原子扩展到一个列表时内部会发生什么,但它的行为就像创建了一个临时对象一样。完全同意-kdb的优化可能非常棘手。通过内存分析,我希望能够间接证实一些假设。但我仍然有一个问题,那就是如何分析q程序。