在 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
我正在尝试理解这一点:
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