使用 over 副词对 table 进行操作

Using over adverb to operate on a table

给定一个二元函数 f 作为参数:

x:A 键控 table
y: 表示要创建的行的键值

并假设更新操作需要 运行 串行(不是批量操作),一旦该键被填充,我们将忽略它的进一步更新:

q)tbl:([col1:()];col2:())
q)kv:10?`a`b`c`d
q)f:{[x;y]if[y in key[x];:x];x upsert (y;1?10)}

q)(f/)[enlist[tbl],kv]
col1| col2
----| ----
a   | 9
b   | 2
c   | 1
d   | 8

有没有更正确的构造调用的方法?将两个输入混合到一个输入列表中感觉有点像 hack,并引发了关于如何容纳超过 2 个参数的函数的问题。

这需要一个小调整:

q)(f/)[tbl;kv]

KX wiki (https://code.kx.com/wiki/Reference/Slash)

对此进行了介绍
/ -  f/[y] is equivalent to f[f[..f[f[y0;y1];y2];..yn-1];yn]
q)+/[1 2 3]
6
q)(f/)[enlist[tbl],kv]  /joining both arguments to a single list

/ - f/[x;y] is equivalent to f[f[..f[f[x;y0];y1];..yn-1];yn] 
q)+/[10;1 2 3]
16
q)(f/)[tbl;kv]    / here we are passing the table as first argument 

也许 运行 对不同输入的更新更有效?

(tbl upsert)/[flip(d;(count d:distinct kv)?10)]