将副词应用于冒号运算符

Applying adverb to colon operator

请帮助我使用冒号 : 运算符,我不知道它是如何工作的。它作为赋值,通过x+:1赋值,全局assignment/view::,I/O0:1:赋值到return值从函数的中间 :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 语言中也称为副词)修改时,: 的行为与任何其他二元运算符一样。在你的例子中

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

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

例如比较

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 不能将它扩展到列表。