在 KDB 中扫描二进制应用程序?

Binary application on scan in KDB?

我正在尝试理解这一点:

100+\ 1 2 3
101 103 106

效果很好。

问题一:

当我将其括在方括号中时,出现了我没有预料到的错误:

(100+\) 1 2 3
'Cannot write to handle 100. OS reports: Bad file descriptor

我在这里做错了什么?好像不是在给我写文件

问题二:

鉴于+[1;2] = 3,我相信:

+[100;]\ 1 2 3
'
  [0]  +[100;]\ 1 2 3

(或者可能 +[;100]\ 1 2 3)也应该与投影一起使用,但事实并非如此。我在这里做错了什么?

问题一:

使用解析来确定执行顺序

q)show pt:parse "(100+\)1 2 3"; // need to escape \
((\;+);100)
1 2 3
q)eval each pt                   // should be clearer now
100
1 2 3
q)
q)value eval each pt             // attempting to apply 100 to list which cannot be done
'Cannot write to handle 100. OS reports: Bad file descriptor
  [0]  value eval each pt
       ^

问题二:

投影是一元的 & 应用于整个右参数。对于一元应用程序,评估将(尝试)继续直到收敛 - https://code.kx.com/q/ref/accumulators/#unary-values

q)(neg\)1 2 3
1  2  3
-1 -2 -3

q)+[100]\[1 2 3]
'wsfull
m 0 68157440

在这种情况下,+\sums 关键字的基础代码。这是被称为 variadic 的几个关键字之一,因为它们的排名不固定。当您尝试 (100+\) 1 2 3 时,kdb 实际上将 sums 的等效项应用于您的输入列表,然后尝试将其写入以处理 100,这当然不存在。所以这就是为什么你得到你得到的错误。

至于问题 2 中的语法,以下内容应该有效(改编自 this 可变参数语法页面)

q)+\[100;1 2 3]
101 103 106

问题 1

当一个迭代器(这里是 \)被应用后缀(像往常一样)到一个函数(这里是 +)时,它派生出一个函数(这里是 +\)可变参数(根据@mturkington)并具有 infix 语法。您可以将其作为一元或二进制应用。您的示例 100+ 2 3 将其作为二进制文件应用。

如果您想将 +\ 应用为一元,解析器需要一个线索。您可以使用括号表示法应用 any 函数。或者您可以将其括起来:(+\) 具有 名词语法 ,列表 (+;-;*;%) 也是如此。您可以使用前缀语法应用或索引名词。

q)100+ 2 3     / binary application, infix syntax
101 103 106
q)+\[100;1 2 3]  / binary application, bracket syntax
101 103 106
q)+\[1 2 3]      / unary application, bracket syntax
1 3 6
q)(+\)1 2 3      / unary application, prefix syntax
1 3 6

问题 2

你没有说你期望使用投影得到什么结果。我假设您正在探索一种不同的方法来获得与第一季度相同的结果。

这里的关键问题是二进制 Add 在 100 上的投影是一元 +[;100](或 +[100] 或只是 100+),而累加器 \应用于一元的 /Converge, Do and While 迭代器。

其中

None 给出了第一季度的结果。对于一元 f,派生函数 f\ 只是连续应用 f

q)5 +[100]\ 1 2 3  / do 100+ five times
1   2   3
101 102 103
201 202 203
301 302 303
401 402 403
501 502 503